服务消费(LoadBalancerClient、Ribbon、OpenFeign)三者的详细说明

使用LoadBalancerClient

在Spring Cloud Commons中提供了大量的与服务治理相关的抽象接口,包括DiscoveryClient、LoadBalancerClient等。从LoadBalancerClient接口的命名中,可以看出这是一个负载均衡客户端的抽象定义

  • 创建一个叫member的Spring Boot项目,引入相关maven包。

  4.0.0
  
    com.infosys.china
    alibabanacos01
    0.0.1-SNAPSHOT
  
  Member
  
		3.1.1
	
  • 父工程引入相关maven包


	4.0.0
	com.infosys.china
	alibabanacos01
	0.0.1-SNAPSHOT
	pom
	
		Order
		Member
	
	
        org.springframework.boot
        spring-boot-starter-parent
        2.2.0.RELEASE
    
       
        
        1.8
        UTF-8
        UTF-8

        
        Hoxton.RELEASE
        2.2.0.RELEASE
        Horsham.SR3
    
    
    
        
            
            
                org.springframework.cloud
                spring-cloud-dependencies
                ${spring-cloud.version}
                pom
                import
            
            
                com.alibaba.cloud
                spring-cloud-alibaba-dependencies
                ${spring-cloud-alibaba.version}
                pom
                import
            
        
    
    

	
        
        
            org.springframework.boot
            spring-boot-starter-web
        
        
            org.springframework.boot
            spring-boot-starter-actuator
        
        
            org.springframework.boot
            spring-boot-starter-test
            test
        
        

        
        
            com.alibaba.cloud
            spring-cloud-starter-alibaba-nacos-discovery
        

        
        
            com.alibaba.cloud
            spring-cloud-starter-alibaba-sentinel
        
        
            com.alibaba.cloud
            spring-cloud-starter-stream-rocketmq
        
        
    
  • 然后配置application.yml,指定服务注册中心地址、端口号以及名称
spring:
  application:
    ###服务的名称
    name: infosys-member
  cloud:
    nacos:
      discovery:
        ###nacos注册地址
        server-addr: 192.168.234.135:8848
server:
  port: 8083
  • loadBalancerClientMember方法直接用LoadBalancerClient.choose来获取在注册中心的服务,本质上也是采用ribbon来实现的负载均衡
/**
 * 文件名:OrderService.java 版权:Company Technologies Co.,Ltd.Copyright YYYY-YYYY,All
 * rights reserved 版权:Copyright (c) 2020, [email protected] All Rights
 * Reserved. 描述:<描述> 修改人:Administrator 修改时间:2020年4月9日 修改内容:<修改内容>
 */
package com.infosys.china.service;

import java.net.URI;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import com.infosys.china.loadbalancer.LoadBalancer;

/**
 * <一句话功能简述> <功能详细描述>
 * 
 * @author Jiayoubing
 * @version [版本号,2020年4月9日]
 * @see [相关类/方法]
 * @since [产品/模块版本]
 */
@RestController
public class OrderService
{
    @Autowired
    private DiscoveryClient discoveryClient;

    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private LoadBalancer loadBalancer;

    @Autowired
    private LoadBalancerClient loadBalancerClient;

    @RequestMapping("/orderToMember")
    public Object orderToMember()
    {
        // 1.根据服务名称从 注册中心获取集群列表地址
        List instances = discoveryClient.getInstances("infosys-member");

        // 2.列表任意选择一个 实现本地rpc调用 rest 采用我们负载均衡的算法
        ServiceInstance srviceInstance = loadBalancer.getSingleAddres(instances);

        URI rpcMemberUrl = srviceInstance.getUri();
        String result = restTemplate.getForObject(rpcMemberUrl + "/getUser", String.class);

        return "订单调用会员返回结果是: " + result;
    }

    /**
     * 
     * 基于Ribbon实现本地负载均衡
     * 
     * @return[参数说明] @return Object[返回类型说明]
     * @exception throws
     *                [违例类型][违例说明]
     * @see [类、类#方法、类#成员]
     */
    @RequestMapping("/orderToRibbonMember")
    public Object orderToRibbonMember()
    {
        String result = restTemplate.getForObject("http://infosys-member/getUser", String.class);
        return "Ribbon实现本地负载均衡,订单调用会员返回结果:" + result;
    }

    /**
     * 
     * 根据loadBalancerClient 实现客户端负载均衡
     * 
     * @return[参数说明] @return Object[返回类型说明]
     * @exception throws
     *                [违例类型][违例说明]
     * @see [类、类#方法、类#成员]
     */
    @RequestMapping("/loadBalancerClientMember")
    public Object loadBalancerClientMember()
    {
        ServiceInstance result = loadBalancerClient.choose("infosys-member");
        return result.getUri();
    }

}

使用Ribbon

Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。它是一个基于HTTP和TCP的客户端负载均衡器。它可以通过在客户端中配置ribbonServerList来设置服务端列表去轮询访问以达到均衡负载的作用。
每个load balancer都是组件的一部分,这些组件协同工作,Spring Cloud通过使用RibbonClientConfiguration为每个指定的客户端创建一个新的套装,这包括ILoadBalancer、RestClient和ServerListFilter。

  • 上面代码orderToRibbonMember方法就是通过过去url的方式来实现从配置中心获取服务,例如:restTemplate.getForObject("http://infosys-member/getUser", String.class);
  • 不过需要在RestTemplate中增加@LoadBalanced注解,不然无法获取到服务http://infosys-member/

例如:

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

使用OpenFeign

OpenFeign是Spring Cloud 在Feign的基础上支持了Spring MVC的注解,如@RequesMapping等等。
OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,
并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。
在使用OpenFeign时提供负载平衡的http客户端。

总结两点:

1、OpenFeign采用的是接口加注解;

2、OpenFeign 整合了ribbon

在服务发起方的maven中引入包

    
            org.springframework.cloud
            spring-cloud-starter-openfeign

        
  • 在程序入口加上@EnableFeignClients注解
@SpringBootApplication
@EnableFeignClients
public class AppOrder {
    public static void main(String[] args) {
        SpringApplication.run(AppOrder.class);
    }
}
  • 在接口调用中引用FeignClient注解,指定需要引用服务名称即可
@FeignClient(name = "infosys-member")
public interface MemberServiceFeign extends MemberService {}

即:三者都可以达到负载均衡的效果,个人喜欢用LoadBalancerClient,只需要指定服务即可。

你可能感兴趣的:(服务消费(LoadBalancerClient、Ribbon、OpenFeign)三者的详细说明)