【Fegin技术专题】「原生态」打开Fegin之RPC技术的开端,你会使用原生态的Fegin吗?(下)

这篇具有很好参考价值的文章主要介绍了【Fegin技术专题】「原生态」打开Fegin之RPC技术的开端,你会使用原生态的Fegin吗?(下)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

内容简介

在项目开发中,除了考虑正常的调用之外,负载均衡和故障转移也是关注的重点,这也是feign + ribbon的优势所在,基于上面两篇文章的基础,接下来我们开展最后一篇原生态fegin结合ribbon服务进行服务远程调用且实现负载均衡机制,也帮助大家学习ribbon奠定基础。

maven依赖

<dependencies>
    <dependency>
        <groupId>com.netflix.feigngroupId>
        <artifactId>feign-coreartifactId>
        <version>8.18.0version>
    dependency>
    <dependency>
        <groupId>com.netflix.feigngroupId>
        <artifactId>feign-jacksonartifactId>
        <version>8.18.0version>
    dependency>
    <dependency>
        <groupId>com.netflix.feigngroupId>
        <artifactId>feign-ribbonartifactId>
        <version>8.18.0version>
    dependency>
	<dependency>
    <groupId>com.netflix.archaiusgroupId>
    <artifactId>archaius-coreartifactId>
dependency>

dependencies>
复制代码

其中feign-core和feign-ribbon是必须的,如果需要在服务消费端和服务生产端之间进行对象交互,建议使用feign-jackson

配置读取

import com.netflix.config.ConfigurationManager;
import feign.Feign;
import feign.jackson.JacksonDecoder;
import feign.jackson.JacksonEncoder;
import feign.ribbon.RibbonClient;
public class AppRun {
    public static void main(String[] args) throws Exception {
        User param = new User();
        param.setUsername("test");
        RemoteService service = Feign.builder().client(RibbonClient.create())
				.encoder(new JacksonEncoder())
                .decoder(new JacksonDecoder())
			    .options(new Options(1000, 3500))
                .retryer(new Retryer.Default(5000, 5000, 3))
			    .target(RemoteService.class, "http://remote-client/gradle-web");

        for (int i = 1; i 10; i++) {
            User result = service.getOwner(param);
            System.out.println(result.getId() + "," + result.getUsername());
        }
    }
}
复制代码
  • 声明了一个User类型的对象param,该对象将作为参数被发送至服务生产端。
  • 重点在于通过RibbonClient.create()使得Feign对象获得了Ribbon的特性。之后通过encoder,decoder设置编码器与解码器,并通过target方法将之前定义的接口RemoteService与一个URL地址http://remote-client/gradle-web进行了绑定。

现在来看remote-client.properties中的配置项,主要多是RemoteClient的配置机制

remote-client.ribbon.MaxAutoRetries=1
remote-client.ribbon.MaxAutoRetriesNextServer=1
remote-client.ribbon.OkToRetryOnAllOperations=true
remote-client.ribbon.ServerListRefreshInterval=2000
remote-client.ribbon.ConnectTimeout=3000
remote-client.ribbon.ReadTimeout=3000
remote-client.ribbon.listOfServers=127.0.0.1:8080,127.0.0.1:8085
remote-client.ribbon.EnablePrimeConnections=false
复制代码

所有的key都以remote-client开头,表明这些配置项作用于名为remote-client的服务。其实就是与之前绑定RemoteService接口的URL地址的schema相对应。

重点看remote-client.ribbon.listOfServers配置项,该配置项指定了服务生产端的真实地址。

在调用时会被替换为:

@RequestLine指定的地址进行拼接,得到最终请求地址。本例中最终请求地址为:

由于使用的ribbon,所以feign不再需要配置超时时长,重试策略。ribbon提供了更为完善的策略实现。

本例中,服务生产端是一个简单的springMvc,实现如下:


public class UserController {

    public User list( User user) throws InterruptedException{
        HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
        user.setId(new Long(request.getLocalPort()));
        user.setUsername(user.getUsername().toUpperCase());
        return user;
    }
}

复制代码

故障转移是通过remote-client.properties中的配置项进行配置。

  • 首先利用archaius项目的com.netflix.config.ConfigurationManager读取配置文件remote-client.properties,该文件位于src/main/resources下。

负载均衡的策略又是如何设置呢?

import com.netflix.client.ClientFactory;
import com.netflix.client.config.IClientConfig;
import com.netflix.config.ConfigurationManager;
import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.RandomRule;
import com.netflix.loadbalancer.ZoneAwareLoadBalancer;
import feign.Feign;
import feign.jackson.JacksonDecoder;
import feign.jackson.JacksonEncoder;
import feign.ribbon.LBClient;
import feign.ribbon.LBClientFactory;
import feign.ribbon.RibbonClient;
public class AppRun {
    public static void main(String[] args) throws Exception {
        ConfigurationManager.loadPropertiesFromResources("remote-client.properties");
        User param = new User();
        param.setUsername("test");
        RibbonClient client = RibbonClient.builder().lbClientFactory(new LBClientFactory() {

            public LBClient create(String clientName) {
                IClientConfig config = ClientFactory.getNamedConfig(clientName);
                ILoadBalancer lb = ClientFactory.getNamedLoadBalancer(clientName);
                ZoneAwareLoadBalancer zb = (ZoneAwareLoadBalancer) lb;
                zb.setRule(new RandomRule());
                return LBClient.create(lb, config);
            }
        }).build();
        RemoteService service = Feign.builder().client(client).encoder(new JacksonEncoder())
                .decoder(new JacksonDecoder()).options(new Options(1000, 3500))
                .retryer(new Retryer.Default(5000, 5000, 3)).target(RemoteService.class, "http://remote-client/gradle-web");

        for (int i = 1; i 10; i++) {
            User result = service.getOwner(param);
            System.out.println(result.getId() + "," + result.getUsername());
        }
    }
}
复制代码

	private IRule zoneAvoidanceRule() {
        return new ZoneAvoidanceRule();
    }

    private IRule randomRule() {
        return new RandomRule();
    }
复制代码

不再使用RibbonClient.create()来创建默认的RibbonClient,而是通过RibbonClient.builder()获得feign.ribbon.Builder,进而设置LBClientFactory的实现来定制LBClient,在创建LBClient的过程中即可指定负载策略的具体实现。

分享资源

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tay3QQq8-1691467722037)(https://pic.imgdb.cn/item/64d0dc6a1ddac507cc857b30.png)]
获取以上资源请访问开源项目 点击跳转文章来源地址https://www.toymoban.com/news/detail-638804.html

到了这里,关于【Fegin技术专题】「原生态」打开Fegin之RPC技术的开端,你会使用原生态的Fegin吗?(下)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 云原生时代下,操作系统生态的挑战与机遇

    在云计算快速发展的背景下,服务器操作系统的产业升级,不再局限于物理服务器层面,市场边界扩张,人工智能、大数据、云计算等新技术的发展也对操作系统的灵活度和智能化提出新的要求。在 2023 龙蜥操作系统大会上, 龙蜥社区理事、蚂蚁集团资深技术专家王旭 分享

    2024年02月21日
    浏览(25)
  • 从传统云架构到云原生生态体系架构的演进

    随着科技的不断发展,云计算领域也经历了巨大的变革。这一演进的核心焦点是从传统云架构过渡到云原生生态体系架构,这个过程在过去的几年里已经发生了显著变化。本文将深入探讨这一演进过程,以及它对企业和技术生态系统的影响。 在云计算兴起之初,虚拟化技术是

    2024年02月08日
    浏览(28)
  • 百度智能云发布国内首个AI原生应用商店,构建全链路大模型生态体系

    面向企业客户启动文心大模型4.0 API调用服务测试申请, 服务超过17000家客户,在各行各业的近500个场景中进行大模型应用落地探索 ……自今年3月面世以来,百度智能云千帆大模型平台作为全球首个一站式企业级大模型平台,为业界交出了唯一一份“满分成绩单”。 10月17日

    2024年02月07日
    浏览(35)
  • 以大模型重构云计算,百度智能云为繁荣AI原生应用生态操碎了心

    临近2024年关,也到了2023年的总结时刻。 如果要问AI领域,2023年最不缺的是什么?“大模型”当仁不让。 那AI领域,2023年最缺的又是什么?一个答案可能是“卡”,但“卡”的问题,毕竟已有多种解决办法或者替代方案;另一个答案便是“应用”了,特别是基于大模型的AI原

    2024年02月04日
    浏览(38)
  • 探索容器化世界:开源容器生态系统概览 | 开源专题 No.61

    Stars: 15.7k License: Apache-2.0 ingress-nginx 是一个使用 NGINX 作为反向代理和负载均衡器的 Kubernetes Ingress 控制器。该项目具有以下核心优势: 使用 NGINX 作为反向代理和负载均衡器 支持多个版本,包括 1.9.1、1.8.2 等 提供详细的变更日志以及支持文档 Stars: 66.8k License: Apache-2.0 Moby 是一

    2024年01月20日
    浏览(42)
  • 集群部署专题之二:超高性能RPC框架Zeroc-ICE集群部署简易教程

    Zeroc ICE在简中互联网的资料十分匮乏,以至于大家线上使用时可能会有所顾虑。其实大家尽可放心,ZerocICE是一款性能和稳定性都非常优秀的RPC组件,这也是我当时选择ZerocICE作为XL-LightHouse的RPC组件的唯一原因。为便于大家快速了解ZerocICE,本文以v3.7版本为例介绍其部署和使

    2024年02月10日
    浏览(26)
  • 微信小程序生态4-扫普通二维码进入小程序、打开短链接进入小程序

    微信小程序生态1-初识小程序 微信小程序生态2-创建一个微信小程序 微信小程序生态3-微信小程序登录流程设计 微信小程序生态4-扫普通二维码进入小程序、打开短链接进入小程序 微信小程序生态5-微信公众号扫码登录PC端网页 微信小程序生态6-微信公众号授权登录(适用于H

    2024年02月02日
    浏览(38)
  • 【Dubbo3云原生微服务开发实战】「Dubbo前奏导学」 RPC服务的底层原理和实现

    Dubbo是一款高效而强大的RPC服务框架,它旨在解决微服务架构下的服务监控和通信问题。该框架提供了Java、Golang等多语言的SDK,使得使用者可以轻松构建和开发微服务。Dubbo具备远程地址发现和通信能力,可通过Dubbo独有的身临其境的服务治理特验为主导,以提高开发人员的功

    2024年02月05日
    浏览(33)
  • 大数据——技术生态体系

    随着大数据行业的发展,大数据生态圈中相关的技术也在一直迭代进步,希望能通过本文帮助大家快速构建大数据生态圈的完整知识体系。  Apache Hive是一个用于数据查询和分析的数据仓库工具。Hive构建在Hadoop之上,并提供了一种类似SQL的查询语言,被称为HiveQL(Hive Query L

    2024年02月07日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包