Java Ribbon与openfeign
kaico2018 人气:0Ribbon 本地负载均衡器
在SpringCloud第一代中使用Ribbon、SpringCloud第二代中直接采用自研发 loadbalancer 即可,默认使用的Ribbon。
本地负载均衡与Nginx 的区别
本地负载均衡器基本的概念:我们的消费者服务从我们的注册中心获取到集群地址列表,缓存到本地,让后本地采用负载均衡策略(轮训、随机、权重、hash一致性等),获取接口列表地址,采用算法获取选择一个接口地址实现本地的rpc远程的。本地负载均衡器是从注册中心获取到集群地址列表,本地实现负载均衡算法,既本地负载均衡器。
Nginx是客户端所有的请求统一都交给我们的Nginx处理,让后在由Nginx实现负载均衡转发,属于服务器端负载均衡器。
应用场景:
Nginx属于服务器负载均衡,应用于Tomcat/Jetty服务器等,而我们的本地负载均衡器,属于客户端负载均衡,应用于在微服务架构中rpc框架中,rest、openfeign、dubbo。
基本使用
注入 restTemplate,加上 @LoadBalanced 注解。
@Bean("restTemplate") @LoadBalanced // 实现本地的负载均衡 public RestTemplate restTemplate(){ return new RestTemplate(); }
请求路径上可以换成服务的名称
@RequestMapping("/orderToMember") public String orderToMember() { // 使用本地rest形式实现rpc调用 String result = restTemplate.getForObject("http://kaico-member/getUser", String.class); return "订单调用会员获取结果:" + result; }
使用 loadBalancerClient 实现负载均衡
@RequestMapping("/orderToMember") public String orderToMember() { // 使用本地rest形式实现rpc调用 ServiceInstance choose = loadBalancerClient.choose("kaico-member"); return "获取结果:" + choose; }
原理分析
ServiceInstance choose = loadBalancerClient.choose(“kaico-member”); 从这行代码分析,
客户端负载均衡器源码:
根据serviceId获取服务
可以支持的算法:默认是轮训
openfeign
openFeign是一个Web声明式的Http客户端调用工具,提供接口和注解形式调用。
openfeign客户端作用:是一个Web声明式的Http客户端远程远程调用工具,底层是封装 HttpClient 技术。
openfeign属于 SpringCloud 自己研发,而 feign 是 netflix 研发的。
基本使用
提供服务方
接口
public interface MenberService { /** * 提供会员接口 * * @param userId * @return */ @GetMapping("/getUser") String getUser(@RequestParam("userId") Long userId); }
接口的实现类
@RestController public class MenberServiceImpl implements MenberService { @Value("${server.port}") private String serverPort; @Override public String getUser(Long userId) { return "我是会员服务端口号为:" + serverPort; } }
此时,服务方提供的接口已经准备好了
接下来编写接口调用方的代码:
1、引入maven 依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> <version>2.0.0.RELEASE</version> </dependency>
2、启动类上开启openfeign 注解:@EnableFeignClients
3、编写 feignClient 接口
@FeignClient(name = "kaico-member") public interface MenberServiceFeign{ /** * 提供会员接口 * * @param userId * @return */ @GetMapping("/getUser") String getUser(@RequestParam("userId") Long userId); }
4、直接调用 MenberServiceFeign 接口的方法
@Autowired private MenberServiceFeign menberServiceFeign; @RequestMapping("/orderToMember") public String orderToMember() { //测试openfeign 调用接口 String user = menberServiceFeign.getUser(1L); return "获取结果:" + user; }
总结:调用方在编写feignClient 接口代码时,只要方法代码和注解和提供方法接口代码一致即可,不要求类的全路径名称一致。然后在接口类上加上注解@FeignClient(name = “kaico-member”)并指定服务名称。openfeign默认是支持负载均衡:轮训算法(ribbon)
微服务的服务名称不能有下划线。
加载全部内容