亲宝软件园·资讯

展开

Java Ribbon与openfeign

kaico2018 人气:0

Ribbon 本地负载均衡器

在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)

微服务的服务名称不能有下划线。

加载全部内容

相关教程
猜你喜欢
用户评论