Spring Cloud-Ribbon 负载均衡

对此官网也有解释说如果该配置放在主程序同包目录下会发生未知异常,这是由于Spring boot的主程序会去扫描同一个层级目录下的文件,这里有两种办法可以解决

第一种:不将自定义配置类放在主程序同包或者其子包中

Spring Cloud-Ribbon 负载均衡

第二种可以添加一些注解避免主程序扫描到自定义配置类,各位可以搜下相关资料

3.多个服务自定义算法(自定义算法类实现)

首先做个简单的测试启动四个服务提供者,每两个提供者挂载同一个服务名下面

第一个服务提供者

application.yml

server: port: 7900 #程序启动后的端口,也就是tomcat的端口,可自定义spring: application: name: provider-usereureka: client: service-url: defaultZone: http://user:user@localhost:8888/eureka/

UserController.java

package com.ithzk.spring.cloud.controller;import com.ithzk.spring.cloud.entity.User;import com.netflix.discovery.EurekaClient;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Value;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RestController;/** * @author hzk * @date 2018/5/13 */@RestController("/")public class UserController { @Autowired private EurekaClient eurekaClient; @Value("${server.port}") private String port; @GetMapping("/user/{id}") public User getUser(@PathVariable Integer id){ return new User(id,"zs",20); } @GetMapping("/eureka/info") public String info(){ //InstanceInfo instanceInfo = eurekaClient.getNextServerFromEureka("PROVIDER-USER", false); //return instanceInfo.getHomePageUrl()+ ":" +instanceInfo.getPort(); return port; }}

第二个服务提供者

application.yml

server: port: 7901 #程序启动后的端口,也就是tomcat的端口,可自定义spring: application: name: provider-usereureka: client: service-url: defaultZone: http://user:user@localhost:8888/eureka/ 

第三个服务提供者

application.yml

server: port: 7902 #程序启动后的端口,也就是tomcat的端口,可自定义spring: application: name: provider-user1eureka: client: service-url: defaultZone: http://user:user@localhost:8888/eureka/

第四个服务提供者

application.yml

server: port: 7903 #程序启动后的端口,也就是tomcat的端口,可自定义spring: application: name: provider-user1eureka: client: service-url: defaultZone: http://user:user@localhost:8888/eureka/启动这四个服务,消费服务和之前一样,只修改接口获取数据区分两个服务名称负载均衡算法

OrderController .java

package com.ithzk.spring.cloud.controller;import com.ithzk.spring.cloud.entity.User;import com.netflix.appinfo.InstanceInfo;import com.netflix.discovery.EurekaClient;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Value;import org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RestController;import org.springframework.web.client.RestTemplate;/** * @author hzk * @date 2018/5/13 */@RestControllerpublic class OrderController { //spring 提供用于访问rest接口的模板对象 @Autowired private RestTemplate restTemplate; @Autowired private EurekaClient eurekaClient; @Value("${user.url}") private String url; @GetMapping("/order/{id}") public User getOrder(@PathVariable Integer id){ //访问提供者 获取数据 通过rest访问获取的json数据转换为的User对象 //PROVIDER-USER 为eureka中提供者注册服务名称 InstanceInfo instanceInfo = eurekaClient.getNextServerFromEureka("PROVIDER-USER", false); //获取接口项目地址 String homePageUrl = instanceInfo.getHomePageUrl(); User user = restTemplate.getForObject(homePageUrl+"/user/" +id, User.class); return user; } @GetMapping("/eureka/info") public String getInfo(){ String portInfo = restTemplate.getForObject("http://PROVIDER-USER/eureka/info", String.class); String portInfo1 = restTemplate.getForObject("http://PROVIDER-USER1/eureka/info", String.class); System.out.println("PROVIDER-USER:"+portInfo+"==================>PROVIDER-USER1:"+portInfo1); return portInfo; }}同样多次请求消费服务,结果如下:
Spring Cloud-Ribbon 负载均衡

可以看出配置了自定义负载均衡算法的PROVIDER-USER仍然是随机访问,而未配置自定义算法的PROVIDER-USER1默认轮询

4.多个服务自定义算法(配置文件实现)

上面讲到我们可以通过自定义一个配置类去实现负载均衡算法的自定义设置,也可以通过配置文件实现这里我们将上面的PROVIDER-USER1也变为随机访问

application.yml

server: port: 8900spring: application: name: consumer-order-ribbonuser: url: http://localhost:7900/user/eureka: client: service-url: defaultZone: http://user:user@localhost:8888/eureka/ instance: prefer-ip-address: true # 在Eureka中显示IPPROVIDER-USER1: ribbon: NFLoadBalacerRuleClassName: com.netflix.loadbalancer.RandomRule #给指定服务配置负载均衡算法
Spring Cloud-Ribbon 负载均衡

这样就实现了负载均衡算法的配置,相对还是很简单的ps: 配置文件中还有一个配置可以禁用ribbonribbon: eureka: enabled: false #在Eureka中禁用riibon,禁用后需要自己负责负载均衡


分享到:


相關文章: