SpringCloud远程调用
远程调用的方式
1.Eureka+Feign(集成了robbion)
http://www.ityouknow.com/springcloud/2017/05/12/eureka-provider-constomer.html
2.Eureka+restTemplate
通过restTemplate.getForObject(“http://SERVICE-AB/info“, String.class); 来实现远程调用
https://blog.csdn.net/small_to_large/article/details/77836672
SpringCloud远程调用和dubbo比的特点:
1.优点
- 少配置,引入jar包和极少的配置实现远程调用
- 用java的eureka替代zookeeper实现注册发现
- 引入多个provider的话(需要spring.application.name参数一样),默认轮询做负载均衡
服务方配置
引入eureka的依赖jar包
启动类@EnableDiscoveryClient 添加允许发现既可以对外提供服务
|
配置spring.application.name参数和eureka.client.serviceUrl.defaultZone参数
eureka.client.serviceUrl.defaultZone= http://localhost:8761/eureka/spring.application.name=spring-cloud-psm-userController里面开放接口,和设置参数
@Controllerpublic class UserController {@Resourceprivate UserServiceInterface userService;@RequestMapping("/findByUsername")@ResponseBodypublic User findByUsername(@RequestParam String username){return userService.findByUsername(username);}}
调用方配置
配置eureka的依赖、spring-cloud-starter-feign jar包依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-feign</artifactId></dependency>启动类配置@EnableDiscoveryClient 和@EnableFeignClients
@SpringBootApplication@EnableDiscoveryClient@EnableFeignClientspublic class PsmApplication {public static void main(String[] args) {SpringApplication.run(PsmApplication.class, args);}}写接口,并在注解上指定调用的RPC的应用程序名 spring.application.name
注意这个bean不需要Controller注解,会被Spring识别,一定要添加@RequestParam否则会接收不到参数import account_huang.entity.User;@FeignClient(name= "spring-cloud-psm-user")public interface UserServiceRemote {@RequestMapping(value = "/findByUsername")User findByUsername(@RequestParam(value = "username") String username);}调用,直接注入类.方法即可
@Resourceprivate UserServiceRemote userServiceRemote;protected AuthenticationInfo doGetAuthenticationInfo() {String username = (String)token.getPrincipal();User user=userServiceRemote.findByUsername(username);if(user == null){return null;}return info;}
熔断器hystrix
http://www.ityouknow.com/springcloud/2017/05/16/springcloud-hystrix.html
- 熔断作用
实现简单的配置且不需要额外的依赖可以实现的功能:
- 当方法调用失败次数达到一定规则(一般是远程调用),会触发熔断,按照熔断类的方法执行
- 如果错误类恢复之后,熔断会自动发现且重新正常运行feign.hystrix.enabled=true@FeignClient(name= "spring-cloud-producer",fallback = HelloRemoteHystrix.class)public interface HelloRemote {@RequestMapping(value = "/hello")public String hello(@RequestParam(value = "name") String name);}@Componentpublic class HelloRemoteHystrix implements HelloRemote{@Overridepublic String hello(@RequestParam(value = "name") String name) {return "hello" +name+", this messge send failed ";}}
- 图形化熔断界面 Hystrix-dashboard Turbine
Hystrix-dashboard 提供单个应用的熔断report,turbine提供多个应用的熔断监控界面
负载均衡
常用策略(共种)
- RoundRobinRule
- RandomRule
- RetryRule
配置方法(必须在调用方的程序中配置,服务提供方直接通过相同的applicationName就可以实现集群了)
通过Feign方法远程调用的话,直接在Spring当中配置策略即可
{Application-Name}.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule比如:spring-cloud-psm-user.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule通过手动Ribbon配置
源码参考这个
https://www.kancloud.cn/fymod/springcloud/536930
类型和使用参考这个
https://blog.csdn.net/rickiyeat/article/details/64918756
需要在启动类里面返回一个IRule的接口实现类
@SpringBootApplication@EnableDiscoveryClientpublic class SpringcloudRibbonApplication {public static void main(String[] args) {SpringApplication.run(SpringcloudRibbonApplication.class, args);}@Bean@LoadBalancedRestTemplate restTemplate() {return new RestTemplate();}@Beanpublic IRule ribbonRule() {return new RandomRule();//这里配置策略,和配置文件对应}}通过默认注入的estTemplate实现远程调用(SERVICE-1是注册的服务方的applicationName)
@Servicepublic class HelloService {@AutowiredRestTemplate restTemplate;public String hiService(String name) {return restTemplate.getForObject("http://SERVICE-1/hi?name="+name,String.class);}}