SpringCloud服务实现同时使用eureka和nacos方法
作者:李奈 发布时间:2022-01-14 13:58:57
一,背景
之所以会想到一个服务同时使用eureka和nacos,是因为遇到一个需求,配置数据是存储在nacos的配置中,然后使用该配置的服务却是在一个eureka环境中。所以此时就需要一个代理服务,它既能够从nacos的config中获取配置数据,又是注册到eureka注册中心中。
二,代理服务创建和配置
2.1 pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>lmc-tools</artifactId>
<groupId>com.lmc</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>tools-2-eureka-nacos</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>com.lmc</groupId>
<artifactId>tools-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- <dependency>-->
<!-- <groupId>com.alibaba.cloud</groupId>-->
<!-- <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>-->
<!-- <version>2021.1</version>-->
<!-- </dependency>-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2021.1</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
<version>3.1.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>
注意,关于nacos,在该服务中不能引入spring-cloud-starter-alibaba-nacos-discovery依赖,只需要引入spring-cloud-starter-alibaba-nacos-config
2.2 bootstrap.yml
server:
port: 9006
servlet:
context-path: /eureka-proxyspring:
application:
name: tools-eureka-proxy
profiles:
active: dev
management:
endpoints:
web:
exposure:
include: "*"
bootstrap-dev.yml
spring:
cloud:
nacos:
server-addr: localhost:9000
config:
namespace: 8628e5dd-a236-4016-b94f-565a001faf2f
file-extension: yaml # 配置内容的数据格式
extension-configs[0]:
data-id: ${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
group: dev
refresh: trueeureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka
registry-fetch-interval-seconds: 10
instance:
instance-id: ${spring.application.name}:${spring.cloud.client.ip-address}:${server.port} # 实例名:application:ip:port
prefer-ip-address: true # 优先使用IP地址作为主机名的标识
lease-renewal-interval-in-seconds: 180 # 续约更新时间间隔
lease-expiration-duration-in-seconds: 200
2.3 Application.java
package per.lmc.tools2.eureka;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* @Description: TODO
* @version: 1.0
*/
@SpringBootApplication
@EnableDiscoveryClient
public class EurekaProxyApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaProxyApplication.class, args);
}
}
2.4 创建接口
2.4.1 ApiMessageController.java
package per.lmc.tools2.eureka.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import per.lmc.tools2.eureka.config.MyNacosProperties;
import com.lmc.common.enums.LanguageEnum;
import com.lmc.common.enums.SplitEnum;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* @Description: TODO API返回参数接口
* @version: 1.0
*/
@RestController
@RequestMapping("/apiMessages")
public class ApiMessageController {
@Autowired
private MyNacosProperties myNacosProperties;
/**
* 获取所有apiMessages
* @param language 语言
* @return 数据集合
*/
@GetMapping("/getAll")
public Map<String, String> apiMessages(String language) {
List<String> apiMessages = myNacosProperties.getApiMessages();
Map<String, String> result = new HashMap<>(20);
if (!CollectionUtils.isEmpty(apiMessages)) {
if (LanguageEnum.English.value().equalsIgnoreCase(language)) {
apiMessages.forEach(a -> result.put(a.split(SplitEnum.API_MESSAGE_SPLIT.value())[0], a.split(SplitEnum.API_MESSAGE_SPLIT.value())[2]));
}else {
apiMessages.forEach(a -> result.put(a.split(SplitEnum.API_MESSAGE_SPLIT.value())[0], a.split(SplitEnum.API_MESSAGE_SPLIT.value())[1]));
}
}
return result;
}
/**
* 通过code获取APIMessage
* @param language 语言
* @param code 参数代码
* @return 参数代码指定信息
*/
@GetMapping("/getOne")
public String getMessage(String language, String code) {
// 获取指定code的记录
List<String> apiMessages = myNacosProperties.getApiMessages().stream().filter(a -> a.startsWith(code)).collect(Collectors.toList());
if (CollectionUtils.isEmpty(apiMessages)) {
return String.format("不存在code为%s的记录", code);
}
if (LanguageEnum.English.value().equalsIgnoreCase(language)) {
return apiMessages.get(0).split(SplitEnum.API_MESSAGE_SPLIT.value())[2];
}else {
return apiMessages.get(0).split(SplitEnum.API_MESSAGE_SPLIT.value())[1];
}
}
}
2.4.2 MyNacosProperties.java
package per.lmc.tools2.eureka.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.annotation.Configuration;
import java.util.List;
/**
* @Description: TODO Nacos配置映射类
* @version: 1.0
*/
@Configuration
@ConfigurationProperties(prefix = "tools")
@RefreshScope
@Data
public class MyNacosProperties {
List<String> apiMessages;
}
在nacos中的配置如下所示:
2.5 运行测试
运行服务,访问 http://localhost:9006/eureka-proxy/apiMessages/getAll?language=en,能成功获取到数据
{"1000":"missing parameter","2000":"server internal exception","0000":"operation succeeded"}
三,将该服务引入eureka注册中心
上面服务实际上已经注册到eureka注册中心中,但是,实际上使用中,我们都是通过网关访问的,所以在网关服务的application.yml中,补充下该服务的路由
server:
port: 8764
servlet:
context-path: /lmcspring:
application:
name: tools-gateway
profiles:
active: dev
cloud:
# 消息总线
bus:
trace:
enabled: true
# 网关配置
gateway:
discovery:
locator:
enabled: true # 开启根据注册中心路由,并随服务的改变而改变路由
lower-case-service-id: true # 开启服务名转为小写
# globalcors:
# default-filters:
# - PreserveHostHeader #发送原主机头
routes:
- id: tools-task
uri: lb://tools-task
# uri: http://localhost:8083
predicates:
- Path=/tltk/**
- id: tools-admin
uri: lb://tools-admin
predicates:
- Path=/monitor/**
filters:
- PreserveHostHeader #发送网关原始主机头
- id: tools-demo
uri: lb://tools-demo
predicates:
- Path=/demo/**
- id: tools-eureka-proxy
uri: lb://tools-eureka-proxy
predicates:
- Path=/eureka-proxy/**eureka:
client:
registry-fetch-interval-seconds: 10
instance:
instance-id: ${spring.application.name}:${spring.cloud.client.ip-address}:${server.port} # 实例名:application:ip:port
prefer-ip-address: true # 优先使用IP地址作为主机名的标识
lease-renewal-interval-in-seconds: 180 # 续约更新时间间隔
lease-expiration-duration-in-seconds: 200
# 项目配置有 server.servlet.context-path 属性,想要被 spring boot admin 监控,就要配置以下属性
health-check-url: http://${spring.cloud.client.ip-address}:${server.port}/actuator/health# 暴露监控断点
management:
endpoints:
web:
exposure:
include: "*"
health:
show-details: alwayslogging:
pattern:
console: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{50} - %msg%n"
file: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{50} - %msg%n"
然后重启网关服务,访问 http://localhost:8764/eureka-proxy/apiMessages/getAll,得到
{"1000":"缺少参数","2000":"服务器内部异常","0000":"操作成功"}
因此,eureka成功从nacos获取数据。
来源:https://blog.csdn.net/lmchhh/article/details/125034678


猜你喜欢
- 1. Spark中的RDDResilient Distributed Datasets(弹性分布式数据集)Spark中的最基本的抽象有了RD
- 一般来说在Android里要实现树形菜单,都是用ExpandableList(也有高手自己继承ListView或者LinearLayout来
- 由于jdk 1.8 之后sun.misc 包下的 BASE64Decode的依赖 被移除我们需要在自己的项目中引入EncodeUtils 工
- 茫茫人海千千万万,感谢这一秒你看到这里。希望我的面试题系列能对你的有所帮助!共勉!愿你在未来的日子,保持热爱,奔赴山海!Java基础知识(继
- 本文实例讲述了Android编程单选项框RadioGroup用法。分享给大家供大家参考,具体如下:今天介绍的是RadioGroup 的组事件
- 使用环境项目环境:Idea 2020.2.3、 Maven 3.6.3 、springboot 2.1.4本人在创建springboot项目
- 引言青蛙见了蜈蚣,好奇地问:"蜈蚣大哥,我很好奇,你那么多条腿,走路的时候先迈哪一条啊?"蜈蚣听后说:"青蛙老
- 本文实例讲述了C#实现对象XML序列化的方法。分享给大家供大家参考。具体实现方法如下:using system;using system.x
- 一.Unsafe类的源码分析JDK的rt.jar包中的Unsafe类提供了硬件级别的原子操作,Unsafe里面的方法都是native方法,通
- 简单工厂模式:由一个工厂对象决定创建出哪一种类的实例。1.抽象类public abstract class People { p
- 摘要:在spring boot中 MVC这部分也有默认自动配置,也就是说我们不用做任何配置,那么也是OK的,这个配置类就是 WebMvcAu
- 在Spring Boot Actuator中提供很多像health、metrics等实时监控接口,可以方便我们随时跟踪服务的性能指标。Spr
- 众所周知,PDF文档除了具有较强稳定性和兼容性外, 还具有较强的安全性,在工作中可以有效避免别人无意中对文档内容进行修改。但与此同
- IO操作字节流java.io.InputStream 输入流,主要是用来读取文件内容的。java.io.OutputStream 输出流,主
- 前言在这个系列博客的第二篇的最后部分提到了预布局,在预布局阶段,计算剩余空间时会把将要移除的 ViewHolder 忽略,从而计算出递补的
- 左右滑动是智能手机最常用的动作,在此简单的封装了一下,以后直接拿来用就可以了。简单的只需要几行就可以了,下面那个类是封装好了的。packag
- 冒泡排序冒泡排序的思想:每次让当前的元素和它的下一个元素比较大小、如果前一个的元素大于后一个元素的话,交换两个元素。这样的话经历一次扫描之后
- Dotnet中嵌入资源(位图、图标或光标等)有两种方式,一是直接把资源文件加入到项目,作为嵌入资源,在代码中通过Assembly的GetMa
- 具体详细介绍请看下文:在使用文件进行交互数据的应用来说,使用FTP服务器是一个很好的选择。本文使用Apache Jakarta Common
- Feign调用中的两种Header传参方式在Spring Cloud Netflix栈中,各个微服务都是以HTTP接口的形式暴露自身服务的,