SpringCloud之Ribbon使用篇

1.环境准备

我们继续使用《SpringCloud之Eureka使用篇》里面Eureka集群环境。
1.首先我这里有spring-cloud-parent pom工程
2.spring-cloud-eureka-server Eureka Server 子工程 这里端口我们使用90开头
我们这里集群由两个服务实例组成,分别是9090与9091端口
3.spring-cloud-user-service-consumer 用户服务 (也就是咱们的服务消费者)这里端口我们使用80 开头
4.spring-cloud-order-service-provider 订单提供服务 (服务提供者) 这里端口我们使用70开头
我们订单服务提供着也由两个实例组成,分别是7070与7071
SpringCloud之Ribbon使用篇_第1张图片

2. spring-cloud-eureka-server

我们spring-cloud-parent 父工程 与Eureka Server 服务spring-cloud-eureka-server不需要动,然后分别启动9090端口与9091端口的Eureka Server。
SpringCloud之Ribbon使用篇_第2张图片

3.订单服务(服务提供者)

3.1 application.yml

我们这里使用springboot profiles 配置文件特性将订单提供者服务spring-cloud-order-service-provider分成不同端口


spring:
  application:
    name: spring-cloud-order-service-provider

---
spring:
  profiles: p1
eureka:
  client:
    service-url:
      defaultZone: http://EurekaServerA:9090/eureka,http://EurekaServerB:9091/eureka
    fetch-registry: true
    register-with-eureka: true
  instance:
    prefer-ip-address: true   # 使用ip注册
    #自定义实例显示格式,添加版本号
    instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}:@project.version@
server:
  port: 7070

---
spring:
  profiles: p2
eureka:
  client:
    service-url:
      defaultZone: http://EurekaServerA:9090/eureka,http://EurekaServerB:9091/eureka
    fetch-registry: true
    register-with-eureka: true
  instance:
    prefer-ip-address: true   # 使用ip注册
    #自定义实例显示格式,添加版本号
    instance-id: ${spring.cloud.client.ip-address}:${spring.application.name}:${server.port}:@project.version@
server:
  port: 7071

并配置idea启动
SpringCloud之Ribbon使用篇_第3张图片
SpringCloud之Ribbon使用篇_第4张图片

3.2 controller

修改controller,让其返回当前服务的端口,利于我们观察

@RestController
@RequestMapping("/order/data")
public class OrderStatisticServiceController {
    @Value("${server.port}")
    private Integer port;
    /**
     * 根据用户id获取今日完单数
     * @param id 用户ID
     * @return  完单数
     */
    @GetMapping("/getTodayFinishOrderNum/{id}")
    public Integer getTodayFinishOrderNum(@PathVariable("id") Integer id){
        return port;
    }
}

3.3 启动

分别启动订单服务提供者 7070 与7071 服务,我们可以看到两个服务提供者注册到Eureka Server 上面了。

4.用户服务(服务调用者)

订单调用者服务: spring-cloud-user-service-consumer:8080

4.1 RestTemplateConfiguration

我们需要在RestTemplate配置类里面在注入RestTemplate的方法上面添加注解@LoadBalanced

@Configuration
public class RestTemplateConfiguration {
    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate(){
        return  new RestTemplate();
    }
}

这就ok了,我们这里不需要添加Ribbon的依赖,因为Eureka Client包里面帮我们引入Ribbon相关的依赖。
SpringCloud之Ribbon使用篇_第5张图片

4.2 controller

这里我们只需要在调用url中写入要调用的服务名字就可以了,然后Ribbon就会帮我们从服务列表找到合适的服务调用的

@RestController
@RequestMapping("/user/data")
public class UserCenterController {
    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/getTodayStatistic/{id}")
    public Integer getTodayStatistic(@PathVariable("id") Integer id){
        String url  ="http://spring-cloud-order-service-provider/order/data/getTodayFinishOrderNum/"+id;
        return restTemplate.getForObject(url, Integer.class);
    }

}

4.3 启动测试

SpringCloud之Ribbon使用篇_第6张图片
我们调用两次,分别返回7071与7070,说明我们Ribbon起作用了。
SpringCloud之Ribbon使用篇_第7张图片
SpringCloud之Ribbon使用篇_第8张图片

4.4 调整负载均衡策略

我们这边默认的负载均衡策略是:ZoneAvoidanceRule:区域权衡策略。然后我们可以通过配置来使用其他的负载均衡策略,比如我们使用随机策略:
application.yml中配置
这个是针对spring-cloud-order-service-provider 这个服务的。

spring-cloud-order-service-provider:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

更多配置可以参考:
我是个链接

你可能感兴趣的:(springcloud,ribbon,负载均衡,springcloud)