三、本地负载均衡器与openfeign声明式客户端

前言

本文是根据蚂蚁课堂余胜军老师的课程所做笔记,记录的要点,部分自己的理解可能有所偏差,不当之处会进行修改。

本地负载均衡器

本地负载均衡器负责从注册中心上获取接口调用地址列表,本地实现负载均衡算法。

原理:获取接口地址列表,采用算法获取一个接口地址实现本地rpc远程调用。

本地负载均衡器与Nginx实现负载均衡器的区别

Nginx属于服务器负载均衡器,客户端所有的请求都统一交给Nginx,再由Nginx转发到真实服务实现负载均衡。

本地负载均衡器:属于客户端负载均衡。

应用场景:

  • Nginx实现对服务器的负载均衡,一般用于tomcat/jetty服务器
  • 本地负载均衡器属于客户端负载均衡器,一般用于微服务rpc远程调用,比如dubbo、openfeign等。

LoadBalanced结合Rest

@GetMapping("/orderRibbonToMember")
public Object orderRibbonToMember() {
    //通过服务地址加上方法名调用,String.class为方法返回值类型
    String object = restTemplate.getForObject("http://member-nacos/user", String.class);
    return "调用返回结果"+object;
}

restTemplate通过服务名来访问,restTemplate上要加上@LoadBalanced注解来实现负载均衡,底层使用的是ribbon。自动完成了通过服务名获取调用地址列表,并选择一个进行调用的功能。

@Bean
@LoadBalanced
public RestTemplate restTemplate() {
    return new RestTemplate();
}

使用LoadBalancerClient实现负载

LoadBalancerClient已经注册,可直接注入使用

@GetMapping("/orderLoadBalancerClient")
public Object orderLoadBalancerClient() {
    //根据服务名通过负载均衡算法获得服务实例
    ServiceInstance choose = loadBalancerClient.choose("member-nacos");
    return choose;
}

Openfeign客户端

SpringCloud第一代采用的是feign,第二代采用openfeign。

Openfeign客户端是一个Web声明式的Http客户端远程调用工具,底层封装了HttpClient技术。

feign是netflix研发,而openfeign是SpringCloud自己研发的,但在使用上的代码写法几乎是一致的。

在项目本地创建一个对应于要远程调用的服务的接口,然后使用@FeignClient注解。注意,要使用@EnableFeignClients开启openfeign

导入openfeign的依赖

<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
            <version>2.0.0.RELEASE</version>
        </dependency>

在service-api-member模块下有一个供调用的服务接口

public interface MemberService {
    @GetMapping("/user")
    String getUser();
}

在service-impl-member模块下实现上面的接口。(接口方法的注解会被实现类的方法继承)

@RestController
public class MemberServiceImpl implements MemberService {
    @Override
    public String getUser() {
        return "会员服务调用";
    }
}

我们要在service-order模块中调用MemberService的实现方法。

MemberService的实现模块的服务名为member-service。在service-order中创建接口对应于MemberService,使用@FeignClient根据服务名可获取调用地址并且已经实现了负载均衡。

@FeignClient("member-service")
public interface MemberServiceFeign {
    @GetMapping("/user")
    String getUser();
}

这样我们在service-order里使用MemberServiceFeign接口中的方法就可以调用MemberService的实现类的方法。

@RestController
public class OrderService {

    @Autowired
    private MemberServiceFeign memberServiceFeign;

    @GetMapping("orderFeignToMember")
    public String orderFeignToMember() {

        String user = memberServiceFeign.getUser();
        return user;
    }
}

注意feign客户端调用的事项:如果请求参数没有加上注解的话,默认采用post请求

Nacso服务注册 服务名称命名不能有下划线,feign获取服务时,服务名有下划线会报错。

原文地址:https://www.cnblogs.com/ylcc-zyq/p/13131650.html