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获取服务时,服务名有下划线会报错。

  • 相关阅读:
    Codeforces 1244C The Football Season (解方程)
    BZOJ 2006 [NOI2010]超级钢琴(ST表+堆)
    51Nod 1681 公共祖先(dfs+树状数组/主席树)
    CF 1076E Vasya and a Tree(dfs+树状数组)
    CF 1076 D Edge Deletion(最短路径+bfs)
    CF Gym 102059I Game on Plane(sg函数)
    POJ 2311 Cutting Game(二维sg)
    POJ 2960 S-Nim(SG函数模板题)
    CF Gym 102059F Fake Plastic Trees
    CF Gym 102059H Fractions(思维题)
  • 原文地址:https://www.cnblogs.com/ylcc-zyq/p/13131650.html
Copyright © 2011-2022 走看看