研发提速: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
研发提速:nacos+openfeign环境下的本地链接服务的更多相关文章
- windows环境下,spring boot服务使用docker打包成镜像并推送到云服务器私有仓库
最近在淘宝上学习springcloud教程,其中有几节课是讲解讲本地springboot服务打包成镜像并推送到云服务器私有仓库,但是教程里面用的事Mac环境,我的是Windows环境,而且课程里面没有 ...
- 在Windows环境下部署Axis2/C服务
Apache Axis2/C是C语言实现的网络服务引擎,基于Axis2架构,支持SOAP1.1和SOAP1.2协议,并且支持RESTful风格的Web service. 下面是本人在Windows 7 ...
- Windows环境下设置Tomcat8以服务的形式运行,不再打开Tomcat窗口
内容简介 在Windows操作系统下,设置Tomcat8以服务的形式运行,按照以下3步来操作即可.前提条件:已安装好Java环境,并配置好java的环境变量:已下载好Tomcat8并解压到某目录. s ...
- Linux环境下安装配置vsftpd服务(三种认证模式)
一.FTP简介 文件传输协议(英文:File Transfer Protocol,缩写:FTP)是用于在网络上进行文件传输的一套标准协议.它工作于网络传输协议的应用层,使用客户/服务器模式,主要是用来 ...
- Windows环境下,本地Oracle创建dblink连接远程mysql
前言 我的情况是,本地安装了oracle(安装完成后带有SQL Developer,不需要再安装instantclient),创建dblink去连接远程的mysql.有些朋友可能是 本地使用PL\SQ ...
- Windows环境下安装配置Mosquitto服务及入门操作介绍
关键字:在windows安装mosquitto,在mosquitto中配置日志,在mosquitto中配置用户账号密码 关于Mosquitto配置的资料网上还是有几篇的,但是看来看去,基本上都是基于L ...
- windows环境下命令打到服务中
1.正常redis在本地命令行中启动,现在直接在服务中启动(tomcat同理) cmd下命令如下: sc create redis binPath= D:\redis\redis-server.exe ...
- 嵌入式环境下通过 UDP 链接来调试 QT 程序
据说有为嵌入式提供的 QT Debug 手段,但是目前还没发现,所以想到了这个笨办法.有更好思路的可以推荐. 该思路是基于 QDebug() .因为 QT 提供了重写 QT msg 处理方法的接口 q ...
- Spring Cloud 入门教程(四): 分布式环境下自动发现配置服务
前一章, 我们的Hello world应用服务,通过配置服务器Config Server获取到了我们配置的hello信息“hello world”. 但自己的配置文件中必须配置config serve ...
- 在Linux环境下设置ArcGIS Server 服务开机自启
在 VMware 11.0 中安装了CentOS 6.5的Linux系统中部署ArcGIS Server,安装完后默认开机不自动启动此服务,每次开机都要手动启动(如下图所示),这样太麻烦.本文记录了设 ...
随机推荐
- iOS 单元测试之常用框架 OCMock 详解
一.单元测试 1.1 单元测试的必要性 测试驱动开发并不是一个很新鲜的概念了.在日常开发中,很多时候需要测试,但是这种输出是必须在点击一系列按钮之后才能在屏幕上显示出来的东西.测试的时候,往往是用模拟 ...
- PostgreSQL 12 文档: 系统表
第 51 章 系统目录 目录 51.1. 概述 51.2. pg_aggregate 51.3. pg_am 51.4. pg_amop 51.5. pg_amproc 51.6. pg_attrde ...
- uniapp学习(一)
[新课uniapp零基础入门到项目打包(微信小程序/H5/vue/安卓apk)全掌握] https://www.bilibili.com/video/BV1mT411K7nW/?p=24&sh ...
- H5 WebGL实现水波特效
前言 零几年刚开始玩电脑的时候,经常在安装程序上看到一种水波特效,鼠标划过去的时候,就像用手在水面划过一样,感觉特别有意思.但是后来,就慢慢很少见过这种特效了.最近突然又想起了这种特效,于是开始折磨怎 ...
- 【2020GET】即构科技蒋宁波:教育行业客户需求的核心是什么?
11月24日,由即构科技主办的2020GET大会教育科技分论坛在北京成功召开,来自叮咚课堂.小冰.360OS.蕃茄田艺术.即构科技的6位资深教育/科技大咖,在论坛上进行深度分享. 以下为即构科技联合创 ...
- dash构建多页应用
dash 构建多页面应用一种方案 本方案对dash官网多页面案例使用dash_bootstrap_components案例进行优化与测试,效果如下 项目代码结构如下 │ app.py │ ├─asse ...
- 多app应用(推荐方式)
多app应用目录结构 项目单独一个app结构: 多个app: 多个app放在一个apps文件夹中, 在根目录下创建apps的文件夹 操作: 没勾选template,那么项目根目录就没有template ...
- 我是如何组织 Go 代码的(目录结构 依赖注入 wire)
背景 对于大多数 Gopher 来说,编写 Go 程序会直接在目录建立 main.go,xxx.go,yyy.go-- 不是说不好,对于小型工程来说,简单反而简洁明了,我也提倡小工程没必要整一些花里胡 ...
- 技术速览|Meta Llama 2 下一代开源大型语言模型
AI 使用大型语言模型(LLM)来理解和生成自然语言.LLM 可以从大量文本中学习并创建有关各种主题的文本,并可以完成比如编写代码.生成歌词.总结文章等任务.但有些 LLM 相关课程成本高昂且封闭,而 ...
- React错误: Can't resolve 'react-dom/client'
错误截图 解决方案 当你的react版本低于18时,但仍然报这个错误,可以采用如下方案 意外的发现当我采用上述方案时,我的React路由跳转时,页面不刷新的问题也解决了,很神奇,日后技艺精进再补充.