微服务架构之spring cloud ribbon

如今负载均衡是通用的解决分压的技术方案,实现方式通常分为服务端或者客户端,服务端大部分是使用中间件实现,spring cloud ribbon 是一个客户端负载均衡组件。跟spring cloud eureka、spring cloud feign 搭配的很默契,下一篇咱们再讲解spring cloud feign。spring

(一) 版本说明app

a) Spring boot 2.0.6.RELEASE负载均衡

b) Spring cloud Finchley.SR2fetch

c) Java version 1.8url

d) Spring-cloud-starter-netflix-ribbon 2.0.2.RELEASEspa

(二) 项目配置3d

1. 服务端项目配置rest

a) 服务端主要是提供服务功能,这里是把当前的端口返回给调用者,同时把本身注册到服务中心,调用者经过服务中心调用。code

b) POM设置server

<dependency>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>

</dependency>

c) application.yml配置文件

eureka: datacenter: ctm environment: dev instance: hostname: 192.168.1.78 prefer-ip-address: true ip-address: 192.168.1.129 lease-renewal-interval-in-seconds: 10 lease-expiration-duration-in-seconds: 30

instance-id: ${eureka.instance.ip-address}:${server.port} client: service-url: defaultZone: http://${eureka.instance.hostname}:1001/eureka/,http://${eureka.instance.hostname}:1002/eureka/,http://${eureka.instance.hostname}:1003/eureka/
 fetch-registry: true register-with-eureka: true healthcheck: enabled: true

d) 主要参数说明

i. eureka.instance.prefer-ip-address 使用IP显示注册信息

ii. eureka.instance.ip-address 实例IP地址,

iii. eureka.instance.instance-id 自定义实例id,服务之间调用就是使用该配置,多个实例必须保证惟一性

iv. eureka.client.service-url.defaultZone 注册中心地址

e) 服务提供者API

@Value("${server.port}") private String getPort; @GetMapping(name = "index", value = "/index") public String Index() { return getPort; }

2. 消费端项目配置

a) POM设置

<dependency>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>

</dependency>

<dependency>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>

</dependency>

i. 这里把服务消费端也注册到了服务治理中心,消费者同时也是其它服务的提供者。

b) application.yml配置文件

eureka: datacenter: ctm environment: dev instance: hostname: 192.168.1.78 prefer-ip-address: true ip-address: 192.168.1.129 lease-renewal-interval-in-seconds: 10 lease-expiration-duration-in-seconds: 30 instance-id: ${eureka.instance.ip-address}:${server.port} client: service-url: defaultZone: http://${eureka.instance.hostname}:1001/eureka/,http://${eureka.instance.hostname}:1002/eureka/,http://${eureka.instance.hostname}:1003/eureka/ fetch-registry: true register-with-eureka: true healthcheck: enabled: true

c) 服务消费者API

@Bean @LoadBalanced RestTemplate restTemplate(){ return new RestTemplate(); } @Service public class RibbonService { @Autowired RestTemplate restTemplate; @HystrixCommand(fallbackMethod = "fallBackIndex") public String Index(){ return restTemplate.getForObject("http://DEMOSERVICEIMPL/index",String.class); } public String fallBackIndex(){ return "hi,ribbon,error!"; } }

3. 重点提示

a) 为了演示负载,3个服务提供者必须设置3个不一样的端口,而且其它相同,否则会被认为是不一样的服务,起不到均衡的做用。

b) LoadBalanced 该注解实现了负载均衡功能,默认策略是轮询

4. 项目运行

a) 运行服务提供者

i. 运行3个服务者实例后,会在服务中心看到以下效果,服务提供者已经注册成功

clip_image002[8]

b) 运行服务消费者

i. 运行消费者,以下图所示

clip_image004[8]

c) 打开PostMan,输入消费者地址,多刷新几回,便可看到负载效果

clip_image006[8]

clip_image007[8]

clip_image008[8]

 

  这样spring cloud ribbon负载组件就介绍完了,若是在开发中遇到问题,也能够留言共同探讨共同进步。