ribbon简介
负载均衡是指将负载分摊到多个执行单元上,常见的负载均衡有两种方式。 一种是独立进程单元,通过负载均衡策略,将请求转发到不同的执行单元上,例如 Ngnix 。另 一种是将负载均衡逻辑以代码的形式封装到务消费者的客户端上,服务消费者客户端维护了 一份服务提供的信息列 ,有了信息列表,通过负载均衡策略将请求分摊给多个服务提供者,从而达到负载均衡的目的。Ribbon Netflix 公司开源的 一个负载均衡的组件,属于上述的第 种方式,是将负载均衡逻辑封装在客户端中,并且运行在客户端的进程里。 Ribbon 是一个经过了云端测试的 IPC库,司以很好地控制 HTT TCP 客户端的负载均衡行为。Spring Cloud 构建的微服务系统中, Ribbon 作为服务消费者的负载均衡器,有两种使用方式, 一种是和 RestTemplate 相结合,另一 种是和 Feign 相结合。Feign 已经默认集成了 Ribbon。
restTemplate和ribbon结合消费服务
新建一个模块 eureka-ribbon-client模块:如图
引入依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-ribbon</artifactId> </dependency>
配置文件配置
配置文件application.yml 配置信息
spring: application: name: eureka-ribbon-client server: port: 8765 eureka: client: serviceUrl: defaultZone: http://localhost:8761/eureka/
在启动类上添加注解
在启动类上添加 注解,@EnableEurekaClient
使用
a)添加负载均衡类 RibbonConfig
@Configuration public class RibbonConfig { @Bean @LoadBalanced RestTemplate restTemplate() { return new RestTemplate(); } }
b)添加ribbon服务类RibbonService,使用时直接调用即可
@Service public class RibbonService { @Autowired RestTemplate restTemplate; public String hi(String name) { return restTemplate.getForObject("http://eureka-client/hi?name="+name,String.class); } }
c)使用
@RestController public class RibbonController { @Autowired RibbonService ribbonService; @GetMapping("/hi") public String hi(@RequestParam(required = false,defaultValue = "forezp") String name){ return ribbonService.hi(name); } @Autowired private LoadBalancerClient loadBalancer; @GetMapping("/testRibbon") public String testRibbon() { ServiceInstance instance = loadBalancer.choose("eureka-client"); // URI uri = URI.create(String.format("http://%s:%s", instance.getHost(), instance.getPort())); return instance.getHost()+":"+instance.getPort(); } }
d)测试
分别启动两次eureka-client实例,端口分别为8763,8764
在浏览器输入http://localhost:8765/hi ,轮循执行eureka-client实例的请求
feign和ribbon结合消费服务
新建eureka-feign-client模块:如下图
引入依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> </dependency> <dependency> <groupId>com.netflix.feign</groupId> <artifactId>feign-httpclient</artifactId> <version>RELEASE</version> </dependency>
配置文件配置
spring: application: name: eureka-feign-client server: port: 8766 eureka: client: serviceUrl: defaultZone: http://localhost:8761/eureka/
在启动类上添加注解
@EnableEurekaClient
@EnableFeignClients
使用
a)新建feign请求失败重试策略类 FeignConfig
@Configuration public class FeignConfig { @Bean public Retryer feignRetryer() { return new Retryer.Default(100, SECONDS.toMillis(1), 5); } }
b)新建调用服务的声明式接口类 EurekaClientFeign
@FeignClient(value = "eureka-client",configuration = FeignConfig.class) public interface EurekaClientFeign { @GetMapping(value = "/hi") String sayHiFromClientEureka(@RequestParam(value = "name") String name); }
c)新建调用声明式接口服务类 HiService
@Service public class HiService { @Autowired EurekaClientFeign eurekaClientFeign; public String sayHi(String name){ return eurekaClientFeign.sayHiFromClientEureka(name); } }
d)使用
@RestController public class HiController { @Autowired HiService hiService; @GetMapping("/hi") public String sayHi(@RequestParam( defaultValue = "forezp",required = false)String name){ return hiService.sayHi(name); } }
f)测试
分别启动两次eureka-client实例,端口分别为8763,8764
在浏览器输入http://localhost:8766/hi ,轮循执行eureka-client实例的请求