这篇先说Ribbon的负载均衡:
Ribbon实现客户端的负载均衡
Ribbon是一个基于Http和TCP客户端的负载均衡器。Ribbon可以通过客户端中配置的ribbonServerList服务端列表去轮训的访问以达到负载均衡的作用。当Ribbon和Eureka联合使用时,ribbonServerList会被DiscoveryEnableNIWSServerList重写,扩展成从Eureka注册中心获取服务端列表。同时它也会用NIWSDiscoveryPing来取代IPing,它将职责委托给Eureka来确定服务端是否已经启动。
下面通过实例来使用Ribbon实现负载均衡。
首先需要有一个服务注册中心eureka-server,还需要两个服务提供方。然后建立一个新的springboot,叫做eureka-ribbon。
启动eureka-server,first-service,second-service 可以看到如下界面,两个服务提供方都叫COMPUTE-SERVICE已经被注册进去。
然后开始编写eureka-ribbon的项目
首先在pom.xml中加入如下代码:
在应用主类中加上@EnableDiscoveryClient注解来添加发现服务能力,然后创建RestTemplate实例,并通过@LoadBalanced注解来开启负载均衡的能力。
@EnableDiscoveryClient
@SpringBootApplication
public class EurekaRibbonApplication {
@Bean
@LoadBalanced
RestTemplate restTemplate(){
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(EurekaRibbonApplication.class, args);
}
}
创建ServiceController来消费service中的add服务,通过restTemplage对象来调用服务,计算10+20的值。
@RestController
public class ServiceController {
@Autowired
private RestTemplate restTemplate;
@RequestMapping(value = "/add",method = RequestMethod.GET)
public String add(){
return restTemplate.getForEntity("http://COMPUTE-SERVICE/add?a=10&b=20";,String.class).getBody();
}
}
在application.properties配置文件中配置eureka服务注册中心
spring.application.name=eureka-ribbon
server.port=3333
eureka.client.serviceUrl.defaultZone=http://localhost:1001/eureka/
启动四个应该用,访问两次localhost:3333/add。
可以看到控制台的first-service和second-service各打印一行日志
打开服务端口为1111的可以看到:
打开服务端口为2222的可以看到:
可以看到,之前启动的两个first-service和second-service服务端分别被调用了一次。到这里,我们已经通过Ribbon在客户端已经实现了对服务调用的均衡负载
Ribbon的执行策略
1.RoundRobinRule(轮询模式) 轮询访问 如果有两个服务 那么就会先访问服务1然后再访问服务2 然后再是1和2 轮流访问。
2.RandomRule(随机策略) 随机调用服务来执行。
3.BestAvailableRule(并发量)
Feign负载均衡
原理:在启动时,Feign会扫描带有注解@FeignClient的接口,生成代理,并注册到spring容器,生成代理时会给每个接口方法创建一个RequestTemplate对象,这个对象封装了http请求的所有信息,请求参数名、请求方法等信息都是在这个过程中确定的。
Feign是一种声明式、模板化的HTTP客户端,
在启动类上需要加上注解,首先是@EnableDiscoveryClient注解,然后再加上@EnableFeignClients注解来开启Feign功能。
在使用feign做负载均衡的时候 需要创建一个接口,不需要编写这个接口的实现类,然后再在接口上加上@FeignClient注解,里面的name属性对应的为需要调用的服务的名字。
然后需要编写接口内的方法,可以在这个方法上添加@RequestMapping的注解value指定方法的名字,method指定请求的方式,get,post等、restful风格
在web层中使用@Autowired注解来注入那个接口的实例,在方法上使用@RequestMapping注解来注解名字和发送方式,然后调用接口里的方法即可。
在application.properites的配置文件里,只需要指定注册中心的url,服务的名字,以及端口号即可。