zoukankan      html  css  js  c++  java
  • 三、本地负载均衡器与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获取服务时,服务名有下划线会报错。

  • 相关阅读:
    python路径拼接os.path.join()函数的用法
    tensorflow_1.x(七):波士顿房价预测(1),数据读取,准备建模,训练模型、进行预测
    (三)基于tfidf和textrank关键字提取
    (二)TextRank原理与实现
    (一)TF-IDF 原理与实现
    文本分类(七):从理论到实践解决文本分类中的样本不均衡问题
    tensorflow_1.x(六):tensorflow2的简单线性回归,
    tensorflow_1.x(五):在训练中显示损失
    反编译工具的使用
    HttpServletResponse
  • 原文地址:https://www.cnblogs.com/ylcc-zyq/p/13131650.html
Copyright © 2011-2022 走看看