Contents
  1. 1. 远程调用的方式
  2. 2. SpringCloud远程调用和dubbo比的特点:
  3. 3. 服务方配置
  4. 4. 调用方配置
  5. 5. 熔断器hystrix
  6. 6. 负载均衡
    1. 6.1. 常用策略(共种)
    2. 6.2. 配置方法(必须在调用方的程序中配置,服务提供方直接通过相同的applicationName就可以实现集群了)

远程调用的方式

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参数一样),默认轮询做负载均衡

服务方配置

  1. 引入eureka的依赖jar包

  2. 启动类@EnableDiscoveryClient 添加允许发现既可以对外提供服务

@EnableDiscoveryClient
@SpringBootApplication
public class PsmUserApplication {
public static void main(String[] args) {
SpringApplication.run(PsmUserApplication.class, args);
}
}
  1. 配置spring.application.name参数和eureka.client.serviceUrl.defaultZone参数

    eureka.client.serviceUrl.defaultZone= http://localhost:8761/eureka/
    spring.application.name=spring-cloud-psm-user
  2. Controller里面开放接口,和设置参数

    @Controller
    public class UserController {
    @Resource
    private UserServiceInterface userService;
    @RequestMapping("/findByUsername")
    @ResponseBody
    public User findByUsername(@RequestParam String username){
    return userService.findByUsername(username);
    }
    }

调用方配置

  1. 配置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>
  2. 启动类配置@EnableDiscoveryClient 和@EnableFeignClients

    @SpringBootApplication
    @EnableDiscoveryClient
    @EnableFeignClients
    public class PsmApplication {
    public static void main(String[] args) {
    SpringApplication.run(PsmApplication.class, args);
    }
    }
  3. 写接口,并在注解上指定调用的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);
    }
  4. 调用,直接注入类.方法即可

    @Resource
    private 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

  1. 熔断作用
    实现简单的配置且不需要额外的依赖可以实现的功能:
  • 当方法调用失败次数达到一定规则(一般是远程调用),会触发熔断,按照熔断类的方法执行
  • 如果错误类恢复之后,熔断会自动发现且重新正常运行
    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);
    }
    @Component
    public class HelloRemoteHystrix implements HelloRemote{
    @Override
    public String hello(@RequestParam(value = "name") String name) {
    return "hello" +name+", this messge send failed ";
    }
    }
  1. 图形化熔断界面 Hystrix-dashboard Turbine
    Hystrix-dashboard 提供单个应用的熔断report,turbine提供多个应用的熔断监控界面

负载均衡

常用策略(共种)

  • RoundRobinRule
  • RandomRule
  • RetryRule

配置方法(必须在调用方的程序中配置,服务提供方直接通过相同的applicationName就可以实现集群了)

  1. 通过Feign方法远程调用的话,直接在Spring当中配置策略即可

    {Application-Name}.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
    比如:
    spring-cloud-psm-user.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
  2. 通过手动Ribbon配置
    源码参考这个
    https://www.kancloud.cn/fymod/springcloud/536930
    类型和使用参考这个
    https://blog.csdn.net/rickiyeat/article/details/64918756

  • 需要在启动类里面返回一个IRule的接口实现类

    @SpringBootApplication
    @EnableDiscoveryClient
    public class SpringcloudRibbonApplication {
    public static void main(String[] args) {
    SpringApplication.run(SpringcloudRibbonApplication.class, args);
    }
    @Bean
    @LoadBalanced
    RestTemplate restTemplate() {
    return new RestTemplate();
    }
    @Bean
    public IRule ribbonRule() {
    return new RandomRule();//这里配置策略,和配置文件对应
    }
    }
  • 通过默认注入的estTemplate实现远程调用(SERVICE-1是注册的服务方的applicationName)

    @Service
    public class HelloService {
    @Autowired
    RestTemplate restTemplate;
    public String hiService(String name) {
    return restTemplate.getForObject("http://SERVICE-1/hi?name="+name,String.class);
    }
    }
Contents
  1. 1. 远程调用的方式
  2. 2. SpringCloud远程调用和dubbo比的特点:
  3. 3. 服务方配置
  4. 4. 调用方配置
  5. 5. 熔断器hystrix
  6. 6. 负载均衡
    1. 6.1. 常用策略(共种)
    2. 6.2. 配置方法(必须在调用方的程序中配置,服务提供方直接通过相同的applicationName就可以实现集群了)