我们继续使用《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
我们spring-cloud-parent 父工程 与Eureka Server 服务spring-cloud-eureka-server不需要动,然后分别启动9090端口与9091端口的Eureka Server。
我们这里使用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
修改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;
}
}
分别启动订单服务提供者 7070 与7071 服务,我们可以看到两个服务提供者注册到Eureka Server 上面了。
订单调用者服务: spring-cloud-user-service-consumer:8080
我们需要在RestTemplate配置类里面在注入RestTemplate的方法上面添加注解@LoadBalanced
@Configuration
public class RestTemplateConfiguration {
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
这就ok了,我们这里不需要添加Ribbon的依赖,因为Eureka Client包里面帮我们引入Ribbon相关的依赖。
这里我们只需要在调用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);
}
}
我们调用两次,分别返回7071与7070,说明我们Ribbon起作用了。
我们这边默认的负载均衡策略是:ZoneAvoidanceRule:区域权衡策略。然后我们可以通过配置来使用其他的负载均衡策略,比如我们使用随机策略:
application.yml中配置
这个是针对spring-cloud-order-service-provider 这个服务的。
spring-cloud-order-service-provider:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
更多配置可以参考:
我是个链接