研发提速:nacos+openfeign环境下的本地链接服务

这篇具有很好参考价值的文章主要介绍了研发提速:nacos+openfeign环境下的本地链接服务。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

项目研发过程中,经常会遇到与测试人员工作重叠的情况,十分影响效率。

做了一个修改,可以在本地环境启动项目后和测试环境交互,并且不影响测试环境,理论上也可以用于线上环境的异常的快速处理。

准备事项如下:

一:搭建本地的nacos服务。

二:导入测试环境相应项目的nacos配置文件。

三:新增代码:

修改LoadBalancerFactory获取服务host的方式,由于是本地启动的项目,并且连接的还是本地的nacos,所以项目启动后,肯定不会注册到测试环境,相对的也获取不到测试环境的其他服务。

由于本人使用的时候是基于CachingSpringLoadBalancerFactory ,如果直接使用时不生效或者异常,可以DEBUG跟踪一下自己框架调用服务时使用的具体LoadBalancerFactory类。

  3 import cn.hutool.http.HttpUtil;
  4 import com.alibaba.fastjson.JSON;
  5 import com.alibaba.fastjson.JSONArray;
  6 import com.alibaba.fastjson.JSONObject;
  7 import com.netflix.client.config.IClientConfig;
  8 import com.netflix.loadbalancer.ILoadBalancer;
  9 import com.netflix.loadbalancer.Server;
 10 import org.springframework.cloud.client.loadbalancer.LoadBalancedRetryFactory;
 11 import org.springframework.cloud.netflix.ribbon.ServerIntrospector;
 12 import org.springframework.cloud.netflix.ribbon.SpringClientFactory;
 13 import org.springframework.cloud.openfeign.ribbon.CachingSpringLoadBalancerFactory;
 14 import org.springframework.cloud.openfeign.ribbon.FeignLoadBalancer;
 15 import org.springframework.cloud.openfeign.ribbon.RetryableFeignLoadBalancer;
 16 import org.springframework.util.ConcurrentReferenceHashMap;
 17 import org.springframework.util.ObjectUtils;
 18 
 19 import java.util.ArrayList;
 20 import java.util.List;
 21 import java.util.Map;
 22 
 23 public class DevCachingSpringLoadBalancerFactory extends CachingSpringLoadBalancerFactory {
 24 
 25     private volatile Map<String, FeignLoadBalancer> cache = new ConcurrentReferenceHashMap<>();
 26     private volatile Map<String, List<Server>> server = new ConcurrentReferenceHashMap<>();
 27     private volatile String ip;
 28     private volatile String port;
 29     private volatile String namespaceid;
 30 
 31     public DevCachingSpringLoadBalancerFactory(SpringClientFactory factory) {
 32         super(factory);
 33     }
 34 
 35     public DevCachingSpringLoadBalancerFactory(SpringClientFactory factory, LoadBalancedRetryFactory loadBalancedRetryPolicyFactory) {
 36         super(factory, loadBalancedRetryPolicyFactory);
 37     }
 38 
 39     public boolean initialize(String ip,String port,String namespaceid) {
 40         this.ip = ip;
 41         this.port = port;
 42         this.namespaceid = namespaceid;
 43         return null != ip ? null != port ?  null != namespaceid ? true : false :false :false;
 44     }
 45 
 46     @Override
 47     public FeignLoadBalancer create(String clientName) {
 48         FeignLoadBalancer client = this.cache.get(clientName);
 49         if (client != null) {
 50             return client;
 51         }
 52         IClientConfig config = this.factory.getClientConfig(clientName);
 53         ILoadBalancer lb = this.factory.getLoadBalancer(clientName);
 54 
 55         //修改部分
 56         List<Server> list = lb.getAllServers();
 57         if (null == list || ObjectUtils.isEmpty(list)) list = new ArrayList<>();
 58         list.addAll(Servers(clientName));
 59         lb.addServers(list);
 60 
 61         ServerIntrospector serverIntrospector = this.factory.getInstance(clientName,
 62                 ServerIntrospector.class);
 63         client = this.loadBalancedRetryFactory != null
 64                 ? new RetryableFeignLoadBalancer(lb, config, serverIntrospector,
 65                 this.loadBalancedRetryFactory)
 66                 : new FeignLoadBalancer(lb, config, serverIntrospector);
 67         this.cache.put(clientName, client);
 68         return client;
 69     }
 70 
 71     /**
 72      * 获取server
 73      * 返回数组,重试机制交由原框架
 74      * http://ip:port/nacos/v1/ns/instance/list?namespaceId=namespaceid&serviceName=client
 75      */
 76     public List<Server> Servers(String client) {
 77         if(server.containsKey(client)) return server.get(client);
 78         else synchronized (server) {
 79             if(server.containsKey(client)) return server.get(client);
 80             else {
 81                 server.put(client,new ArrayList<Server>());
 82                 String url = new StringBuilder("http://")
 83                         .append(ip)
 84                         .append(":")
 85                         .append(port)
 86                         .append("/nacos/v1/ns/instance/list?")
 87                         .append("namespaceId=")
 88                         .append(namespaceid)
 89                         .append("&serviceName=")
 90                         .append(client).toString();
 91                 JSONObject jsonObject = JSON.parseObject(HttpUtil.get(url));
 92                 JSONArray hosts = jsonObject.getJSONArray("hosts");
 93                 for (int i = 0; i < hosts.size(); i++) {
 94                     server.get(client).add(new Server(hosts.getJSONObject(i).getString("ip"),hosts.getJSONObject(i).getInteger("port")));
 95                 }
 96                 return server.get(client);
 97             }
 98         }
 99     }
100 
101 }

这个文件可以不用添加,主要是用来做一些其他的扩展。

 3 import feign.Client;
 4 import feign.Request;
 5 import feign.Response;
 6 import org.springframework.cloud.netflix.ribbon.SpringClientFactory;
 7 import org.springframework.cloud.openfeign.ribbon.CachingSpringLoadBalancerFactory;
 8 import org.springframework.cloud.openfeign.ribbon.LoadBalancerFeignClient;
 9 
10 import java.io.IOException;
11 
12 public class DevFeignClient extends LoadBalancerFeignClient{
13 
14     public DevFeignClient(Client delegate, CachingSpringLoadBalancerFactory lbClientFactory, SpringClientFactory clientFactory) {
15         super(delegate, lbClientFactory, clientFactory);
16     }
17 
18     @Override
19     public Response execute(Request request, Request.Options options) throws IOException {
20         return super.execute(request, options);
21     }
22 }

配置文件用来替换原来IOC中的BEAN,另外用于获取后面yml文件中的自定义配置。

 3 import feign.Client;
 4 import org.springframework.beans.factory.annotation.Value;
 5 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 6 import org.springframework.cloud.netflix.ribbon.SpringClientFactory;
 7 import org.springframework.cloud.openfeign.ribbon.CachingSpringLoadBalancerFactory;
 8 import org.springframework.context.annotation.Bean;
 9 import org.springframework.context.annotation.Configuration;
10 
11 @Configuration
12 public class DevFeignConfig {
13 
14     @ConditionalOnProperty("feign.dev.enabled")
15     @Configuration(proxyBeanMethods = false)
16     class DefaultFeignLoadBalancedConfiguration {
17         @Value("${feign.dev.ip}")
18         String ip;
19         @Value("${feign.dev.port}")
20         String port;
21         @Value("${feign.dev.namespaceid}")
22         String namespaceid;
23 
24 
25         @Bean
26         public Client feignClient(CachingSpringLoadBalancerFactory cachingFactory, DevCachingSpringLoadBalancerFactory devFactory,
27                                   SpringClientFactory clientFactory) {
28             System.out.println("#####################################进入本地调试模式#####################################");
29             return new DevFeignClient(new Client.Default(null, null),null == devFactory?cachingFactory:devFactory,
30                     clientFactory);
31         }
32 
33         @Bean
34         public DevCachingSpringLoadBalancerFactory devFactory(SpringClientFactory factory) {
35             DevCachingSpringLoadBalancerFactory devFactory = new DevCachingSpringLoadBalancerFactory(factory);
36             if(devFactory.initialize(ip,port,namespaceid)) return devFactory;
37             System.out.println("#####################################本地调试模式异常#####################################");
38             System.out.println("feign.dev.ip " + ip);
39             System.out.println("feign.dev.port " + port);
40             System.out.println("feign.dev.namespaceid " + namespaceid);
41             System.out.println("#####################################本地调试模式异常#####################################");
42             return null;
43         }
44     }
45 
46 
47 }

修改yml文件,主要是用来配置新增的自定义属性和小插件的开启和关闭。

建议手动在本地项目的yml文件添加属性,yml文件的配置,直接复制容易出现问题。

新增属性如下:

feign.dev.enabled
feign.dev.ip
feign.dev.port
feign.dev.namespaceid
server:
  port: 服务端口号
spring:
  application:
    name: 服务名称
  profiles:
    active: dev
  cloud:
    nacos:
      config:
        file-extension: yml
        namespace: 本地Nacos的命名空间
      username: 本地Nacos的账号
      password: 本地Nacos的密码
      server-addr: 本地Nacos的IP:本地Nacos的端口号
      discovery:
        namespace: 本地Nacos的命名空间
        group: DEFAULT_GROUP
        enabled: true
        register-enabled: true
feign:
  dev:
    #true为开启本地调式,false为关闭
    enabled: false
    ip: 测试环境Nacos的IP
    port: 测试环境Nacos的端口号
    namespaceid:  测试环境Nacos的命名空间
  client:
    config:
      default:
        #不设置connectTimeout会导致readTimeout设置不生效
        connectTimeout: 5000
        readTimeout: 5000

 文章来源地址https://www.toymoban.com/news/detail-711783.html

到了这里,关于研发提速:nacos+openfeign环境下的本地链接服务的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • windows环境下的langchain-ChatGLM的本地部署

    首先是项目开源地址 https://github.com/imClumsyPanda/langchain-ChatGLM 下载这个项目的源码非常简单,但运行起来十分麻烦,各种环境的搭配简直是折磨人,尤其是电脑上缺少各种安装环境的,我首先先列举几个,例如conda安装python的虚拟环境,用这个比较方便,还有Anoconda的安装,

    2024年02月13日
    浏览(46)
  • C++的编译链接与在vs中build提速

    通过gcc或msvc,clang等编译器编译出来的C++源文件是.o文件。在windows上也就是PE文件,linux为ELF文件,在这一步中,调用其它代码文件中的函数的函数地址是未知的(00000),等到链接之后才会替换掉函数地址的 linux,windows 可执行文件(ELF、PE) C/C++编译过程主要分为4个过程 编译预处

    2024年02月10日
    浏览(37)
  • 熟练使用Nacos、GateWay、OpenFeign、Sentinel常用组件

    Nacos 面试题 : 请简述Nacos是什么,它主要解决了什么问题? Nacos提供了哪些核心功能? Nacos是如何支持服务发现的? 如何使用Nacos作为配置中心? Nacos的集群部署是如何实现的? 答案 : Nacos是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。它主要解

    2024年04月13日
    浏览(40)
  • Nacos 自定义负载均衡,优先使用同IP服务(本地服务优先调用)

    在微服务开发过程中,随着微服务数量越来越多,不可能将所有的微服务都在本地启用然后进行调试。最好的方式是需要调试那个服务就启动那个服务,所有的服务都使用开发Nacos,本地需要搭建nacos。 使用nacos在开发微服务的过程中,如果多人同时开发使用同一台服务就会导

    2024年01月19日
    浏览(44)
  • 磐维数据库panweidb单节点服务器在centos7.9安装(研发环境)

    使用omm用户登录到openGauss包安装的主机,解压openGauss压缩包到安装目录(假定安装目录为/opt/panweidb/soft,请用实际值替换)。 假定解压包的路径为/opt/panweidb/soft,进入解压后目录下的simpleInstall。 执行install.sh脚本安装openGauss。 上述命令中,-w是指初始化数据库密码(gs_initdb指

    2024年02月06日
    浏览(51)
  • SpringCloud Alibaba Demo(Nacos,OpenFeign,Gatway,Sentinel)

    ma/springcloud-alibaba-demo 参考:https://www.cnblogs.com/zys2019/p/12682628.html SpringBoot、SpringCloud 、SpringCloud Alibaba 以及各种组件存在版本对应关系。可参考下面 版本对应 启动nacos.   ./startup.cmd -m standalone  登陆nacos官方 localhost:8848   nacos/nacos 创建父工程spring-cloud-alibaba pom.xml如下: Naco

    2024年02月06日
    浏览(42)
  • 扒一扒Nacos、OpenFeign、Ribbon、loadbalancer组件协调工作的原理

    大家好,我是三友~~ 前几天有个大兄弟问了我一个问题,注册中心要集成SpringCloud,想实现SpringCloud的负载均衡,需要实现哪些接口和规范。 既然这个兄弟问到我了,而我又刚好知道,这不得好好写一篇文章来回答这个问题,虽然在后面的聊天中我已经回答过了。 接下来本文

    2023年04月11日
    浏览(44)
  • Nacos服务注册或发现、Nacos服务分级模型、Nacos负载均衡策略、加权负载均衡、Nacos环境隔离

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

    2024年01月16日
    浏览(41)
  • 在win10电脑上搭建python环境下的本地AI绘画工具Stable Diffusion

    随着Chatgpt的横空出世,人工智能受到了前所没有的热棒,AI绘画也进入大众的视野。 Stable Diffusion是一种可以部署在本地环境上运行的人工智能绘画工具,图形运算主要用到的是显卡的GPU性能,因此 最好有至少4G显存的显卡 。 Stable Diffusion首先需要搭建本地的UI界面即:stabl

    2024年02月16日
    浏览(52)
  • 《Spring Cloud学习笔记:Nacos配置管理 & OpenFeign & LoadBalancer & Getway》

    基于Feign的声明式远程调用(代码更优雅),用它来去代替我们之前的RestTemplate方式的远程调用 首先我们来看一下,微服务架构下关于配置文件的一些问题: 配置文件相对分散。在一个微服务架构下,配置文件会随着微服务的增多变的越来越多,而且分散在各个微服务中,不

    2024年02月04日
    浏览(52)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包