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

简介: 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架构,所以网关在做对应的适配。图例如下:

网关适配

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
目录
相关文章
|
9月前
|
算法 Java 微服务
【SpringCloud(1)】初识微服务架构:创建一个简单的微服务;java与Spring与微服务;初入RestTemplate
微服务架构是What?? 微服务架构是一种架构模式,它提出将单一应用程序划分为一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。 每个服务允许在其独立的进程中,服务于服务间采用轻量级的通信机制互相协作(通常是Http协议的RESTful API或RPC协议)。 每个服务都围绕着具体业务进行构建,并且能够被独立的部署到生产环境、类生产环境等。另外应当尽量避免统一的、集中式的服务管理机制,对具体的一个服务而言,应根据上下文,选择合适的语言、工具对其进行构建
718 126
|
9月前
|
负载均衡 算法 Java
【SpringCloud(2)】微服务注册中心:Eureka、Zookeeper;CAP分析;服务注册与服务发现;单机/集群部署Eureka;连接注册中心
1. 什么是服务治理? SpringCloud封装了Netfix开发的Eureka模块来实现服务治理 在传统pc的远程调用框架中,管理每个服务与服务之间依赖关系比较复杂,管理比较复杂,所以需要使用服务治理,管理服务于服务之间依赖关系,可以实现服务调用、负载均衡、容错等,实现服务发现与注册
484 0
|
11月前
|
监控 Java API
Spring Boot 3.2 结合 Spring Cloud 微服务架构实操指南 现代分布式应用系统构建实战教程
Spring Boot 3.2 + Spring Cloud 2023.0 微服务架构实践摘要 本文基于Spring Boot 3.2.5和Spring Cloud 2023.0.1最新稳定版本,演示现代微服务架构的构建过程。主要内容包括: 技术栈选择:采用Spring Cloud Netflix Eureka 4.1.0作为服务注册中心,Resilience4j 2.1.0替代Hystrix实现熔断机制,配合OpenFeign和Gateway等组件。 核心实操步骤: 搭建Eureka注册中心服务 构建商品
1485 3
|
9月前
|
负载均衡 Java API
《深入理解Spring》Spring Cloud 构建分布式系统的微服务全家桶
Spring Cloud为微服务架构提供一站式解决方案,涵盖服务注册、配置管理、负载均衡、熔断限流等核心功能,助力开发者构建高可用、易扩展的分布式系统,并持续向云原生演进。
|
10月前
|
监控 安全 Java
Spring Cloud 微服务治理技术详解与实践指南
本文档全面介绍 Spring Cloud 微服务治理框架的核心组件、架构设计和实践应用。作为 Spring 生态系统中构建分布式系统的标准工具箱,Spring Cloud 提供了一套完整的微服务解决方案,涵盖服务发现、配置管理、负载均衡、熔断器等关键功能。本文将深入探讨其核心组件的工作原理、集成方式以及在实际项目中的最佳实践,帮助开发者构建高可用、可扩展的分布式系统。
595 1
|
10月前
|
jenkins Java 持续交付
使用 Jenkins 和 Spring Cloud 自动化微服务部署
随着单体应用逐渐被微服务架构取代,企业对快速发布、可扩展性和高可用性的需求日益增长。Jenkins 作为领先的持续集成与部署工具,结合 Spring Cloud 提供的云原生解决方案,能够有效简化微服务的开发、测试与部署流程。本文介绍了如何通过 Jenkins 实现微服务的自动化构建与部署,并结合 Spring Cloud 的配置管理、服务发现等功能,打造高效、稳定的微服务交付流程。
1102 0
使用 Jenkins 和 Spring Cloud 自动化微服务部署
|
10月前
|
Kubernetes Java 微服务
Spring Cloud 微服务架构技术解析与实践指南
本文档全面介绍 Spring Cloud 微服务架构的核心组件、设计理念和实现方案。作为构建分布式系统的综合工具箱,Spring Cloud 为微服务架构提供了服务发现、配置管理、负载均衡、熔断器等关键功能的标准化实现。本文将深入探讨其核心组件的工作原理、集成方式以及在实际项目中的最佳实践,帮助开发者构建高可用、可扩展的分布式系统。
829 0
|
JSON Java API
利用Spring Cloud Gateway Predicate优化微服务路由策略
Spring Cloud Gateway 的路由配置中,`predicates`​(断言)用于定义哪些请求应该匹配特定的路由规则。 断言是Gateway在进行路由时,根据具体的请求信息如请求路径、请求方法、请求参数等进行匹配的规则。当一个请求的信息符合断言设置的条件时,Gateway就会将该请求路由到对应的服务上。
1709 69
利用Spring Cloud Gateway Predicate优化微服务路由策略
|
Java 开发者 微服务
从单体到微服务:如何借助 Spring Cloud 实现架构转型
**Spring Cloud** 是一套基于 Spring 框架的**微服务架构解决方案**,它提供了一系列的工具和组件,帮助开发者快速构建分布式系统,尤其是微服务架构。
2713 70
从单体到微服务:如何借助 Spring Cloud 实现架构转型