编码实现Spring Cloud微服务负载均衡调用(eureka、ribbon)

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
简介: Spring 封装、揉和了一批开源项目,其中以Netflix开源的为主,比如zuul、eureka、hystrix、robbin等;然后就有了现在的Spring cloud微服务架构。这也充分展现了Spring的揉合能力。 Spring cloud通过封装使这些项目融入spring的bean管理机制中,从而方便使用。这套微服务的核心功能还是使用这些项目的。 由本篇的标题可以想到本篇就是

Spring 封装、揉和了一批开源项目,其中以Netflix开源的为主,比如zuul、eureka、hystrix、robbin等;然后就有了现在的Spring cloud微服务架构。这也充分展现了Spring的揉合能力。

Spring cloud通过封装使这些项目融入spring的bean管理机制中,从而方便使用。这套微服务的核心功能还是使用这些项目的。

由本篇的标题可以想到本篇就是不使用Spring的注解和配置来使用这套微服务。看看现在网上关于Spring cloud的示例,千篇一律那几行注解和代码。确实方便了使用。

本篇主要从微服务的调用端来讲解的,主要涉及如下几点:

  1. 全局配置,包括服务注册中心配置;
  2. 初始化服务发现客户端;
  3. 实例化负载均衡调用实现类;
  4. 实例化某个具体调用requset,再对根据服务均衡器选择的服务提供者进行调用;

如果你使用过dubbo的泛化调用,会发现很相似;难怪有人专门对比使用Spring cloud和dubbo来实现微服务。

如下为编码实现的例子,很多说明在注解中;

EurekaClientConfigBean bean = new EurekaClientConfigBean();
        Map<String, String> map = new HashMap<String, String>();
        //eureka服务注册中心地址
        map.put(EurekaClientConfigBean.DEFAULT_ZONE,"http://xx.xx.xxx.xx:1062/eureka/,http://xx.xx.xxx.xx:1063/eureka/,http://xx.xx.xxx.xx:1064/eureka/");
        bean.setServiceUrl(map);

        EurekaInstanceConfigBean instanceConfigBean = new EurekaInstanceConfigBean(new InetUtils(new InetUtilsProperties()));
        instanceConfigBean.setPreferIpAddress(true);

        ApplicationInfoManager applicationInfoManager = new ApplicationInfoManager(instanceConfigBean);
        //以上完成全局配置,基本使用默认配置

        //实例化eureka服务消费端,查询Eureka Server中的服务实例列表
        final DiscoveryClient client = new DiscoveryClient(applicationInfoManager, bean);
        Provider<EurekaClient> eurekaClientProvider = new Provider<EurekaClient>() {
            @Override
            public synchronized EurekaClient get() {
                return client;
            }
        };

        IClientConfig clientConfig = new DefaultClientConfigImpl();
        clientConfig.loadDefaultValues();
        //设置vipAddress,该值对应spring.application.name配置,指定某个应用
        clientConfig.set(CommonClientConfigKey.DeploymentContextBasedVipAddresses,"ZPROVIDER");

        //根据eureka client获取服务列表,client以provide形式提供
        DiscoveryEnabledNIWSServerList discoveryEnabledNIWSServerList = new DiscoveryEnabledNIWSServerList(clientConfig, eurekaClientProvider);

        //实例化负载均衡器接口ILoadBalancer,这里使用了ZoneAwareLoadBalancer,这也是spring cloud默认使用的。该实现可以避免了跨区域(Zone)访问的情况。
        //其中的参数分别为,1)某个具体应用的客户端配置,2)负载均衡的处理规则IRule对象,负载均衡器实际进行服务实例选择任务是委托给了IRule实例中的choose函数来实现,
        //这里使用了ZoneAvoidanceRule,3)实例化检查服务实例是否正常服务的IPing接口对象,负载均衡器启动一个用于定时检查Server是否健康的任务。该任务默认的执行间隔为:10秒。
        //这里没有做真实的ping操作,他只是检查DiscoveryEnabledNIWSServerList定时刷新过来的服务列表中的每个服务的状态;4)如上,ServerList接口有两个方法,分别为
        //获取初始化的服务实例清单和获取更新的服务实例清单;5)ServerListFilter接口实现,用于对服务实例列表的过滤,根据规则返回过滤后的服务列表;6)ServerListUpdater服务更新器接口
        //实现动态获取更新服务列表,默认30秒执行一次
        ILoadBalancer loadBalancer = new ZoneAwareLoadBalancer(clientConfig, new ZoneAvoidanceRule(), new NIWSDiscoveryPing(),
                discoveryEnabledNIWSServerList,new DefaultNIWSServerListFilter(), new EurekaNotificationServerListUpdater(eurekaClientProvider));

        //实例化request client,他对由负载均衡器选择的Server进行请求,Spring cloud封装了apache HttpClient和OkHttp两种实现
        RibbonLoadBalancingHttpClient ribbonLoadBalancingHttpClient = new RibbonLoadBalancingHttpClient(clientConfig, new DefaultServerIntrospector());
        ribbonLoadBalancingHttpClient.setLoadBalancer(loadBalancer);

//        OkHttpLoadBalancingClient okHttpLoadBalancingClient = new OkHttpLoadBalancingClient(clientConfig, new DefaultServerIntrospector());
//        okHttpLoadBalancingClient.setLoadBalancer(loadBalancer);

        //实例化某个具体request的上下文,如果对应到开放平台上,这些信息就是开放某个具体接口时,录入的API信息
        RibbonCommandContext context = new RibbonCommandContext("ZPROVIDER","get", "/test/weber", Boolean.FALSE, new HttpHeaders(),
                new LinkedMultiValueMap(), null, new ArrayList<RibbonRequestCustomizer>(), null);

        RibbonCommandContext context1 = new RibbonCommandContext("ZPROVIDER","get", "/sum?v=2&vv=3", Boolean.FALSE, new HttpHeaders(),
                new LinkedMultiValueMap(), null, new ArrayList<RibbonRequestCustomizer>(), null);

        BufferedReader br = null;
        String result = "";
        try {
            //实例化request,对Service请求调用
            RibbonApacheHttpResponse response = ribbonLoadBalancingHttpClient.executeWithLoadBalancer(new RibbonApacheHttpRequest(context1));

//            OkHttpRibbonResponse response = okHttpLoadBalancingClient.executeWithLoadBalancer(new OkHttpRibbonRequest(context1));

            //如果服务接口输出json或xml,可以拿到显示
            br = new BufferedReader(new InputStreamReader(response.getInputStream()));
            String line = null;
            while((line = br.readLine())!=null){
                result+=line;
            }
            System.out.println("Result: "+result);
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            if(null!=br){
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

zuul实现了网关框架,主要逻辑为执行pre、route、post三种类型的filter,且可以动态加载filter,使用方可以实现自己的filter。

Spring cloud封装实现的route类型filter,默认使用了ribbon对eureka 服务发现的负载均衡client。

Spring cloud在结合了ribbon的负载均衡实现中,封装增加了HttpClient和OkHttp两种HTTP请求端实现。

Spring cloud中还集成了Feign,方便的使用HTTP请求调用远程服务,且可以灵活的使用和自定义各种编解码器实现入参和出差的序列化和反序列化。

做上面的代码示例的想法来源于现在负责的网关项目中一些需求想法,之前网关只适配了dubbo类型的rpc服务集群,目前一些新项目开始试行spring cloud架构,所以网关在做对应的适配。图例如下:

网关适配

相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
3月前
|
负载均衡 算法 Java
Spring Cloud全解析:负载均衡算法
本文介绍了负载均衡的两种方式:集中式负载均衡和进程内负载均衡,以及常见的负载均衡算法,包括轮询、随机、源地址哈希、加权轮询、加权随机和最小连接数等方法,帮助读者更好地理解和应用负载均衡技术。
|
1月前
|
负载均衡 Java Nacos
Ribbon负载均衡
Ribbon负载均衡
31 1
Ribbon负载均衡
|
4月前
|
负载均衡 算法 架构师
Ribbon负载均衡
上一节就已经实现的负载均衡笔者并未深入探讨,本节通过分析负载均衡算法、Ribbon实现负载均衡的底层原理和实现过程,让大家对负载均衡有了一个大体认识,同时针对Ribbon自定义负载均衡策略,饥饿加载让大家对于Ribbon的了解又多一些。Ribbon实现的负载均衡只是方案之一,我们可以尽量多了解但不要局限于此。
|
1月前
|
负载均衡 监控 网络协议
SpringCloud之Ribbon使用
通过以上步骤,就可以在Spring Cloud项目中有效地使用Ribbon来实现服务调用的负载均衡,提高系统的可靠性和性能。在实际应用中,根据具体的业务场景和需求选择合适的负载均衡策略,并进行相应的配置和优化,以确保系统的稳定运行。
61 15
|
1月前
|
负载均衡 算法 Java
除了 Ribbon,Spring Cloud 中还有哪些负载均衡组件?
这些负载均衡组件各有特点,在不同的场景和需求下,可以根据项目的具体情况选择合适的负载均衡组件来实现高效、稳定的服务调用。
80 5
|
17天前
|
负载均衡 Java Nacos
常见的Ribbon/Spring LoadBalancer的负载均衡策略
自SpringCloud 2020版起,Ribbon被弃用,转而使用Spring Cloud LoadBalancer。Ribbon支持轮询、随机、加权响应时间和重试等负载均衡策略;而Spring Cloud LoadBalancer则提供轮询、随机及Nacos负载均衡策略,基于Reactor实现,更高效灵活。
42 0
|
3月前
|
负载均衡 Java Nacos
SpringCloud基础1——远程调用、Eureka,Nacos注册中心、Ribbon负载均衡
微服务介绍、SpringCloud、服务拆分和远程调用、Eureka注册中心、Ribbon负载均衡、Nacos注册中心
SpringCloud基础1——远程调用、Eureka,Nacos注册中心、Ribbon负载均衡
|
4月前
|
存储 设计模式 缓存
OpenFeign集成Ribbon负载均衡-过滤和选择服务核心实现
该文章主要介绍了如何在OpenFeign中集成Ribbon以实现负载均衡,并详细分析了Ribbon中服务选择和服务过滤的核心实现过程。文章还涉及了Ribbon中负载均衡器(ILoadBalancer)和负载均衡策略(IRule)的初始化方式。
OpenFeign集成Ribbon负载均衡-过滤和选择服务核心实现
|
4月前
|
缓存 负载均衡 Java
OpenFeign最核心组件LoadBalancerFeignClient详解(集成Ribbon负载均衡能力)
文章标题为“OpenFeign的Ribbon负载均衡详解”,是继OpenFeign十大可扩展组件讨论之后,深入探讨了Ribbon如何为OpenFeign提供负载均衡能力的详解。
OpenFeign最核心组件LoadBalancerFeignClient详解(集成Ribbon负载均衡能力)
|
4月前
|
负载均衡 算法 Java
SpringCloud之Ribbon使用
通过 Ribbon,可以非常便捷的在微服务架构中实现请求负载均衡,提升系统的高可用性和伸缩性。在实际使用中,需要根据实际场景选择合适的负载均衡策略,并对其进行适当配置,以达到更佳的负载均衡效果。
107 13
下一篇
DataWorks