1.项目简介
Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。 依托 Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以将 Spring Cloud应用接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统。1.1 组件
Nacos 致力于发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。2.Nacos 的核心概念
2.1 服务 (Service)
服务是指一个或一组软件功能(例如特定信息的检索或一组操作的执行),其目的是不同的客户端可以为不同的目的重用(例如通过跨进程的网络调用)。Nacos 支持主流的服务生态,如 Kubernetes Service 、 gRPC|Dubbo RPC Service 或 者 Spring Cloud RESTfulService.2.2 服务注册中心 (Service Registry)
服务注册中心,它是服务实例及元数据的数据库。服务实例在启动时注册到服务注册表,并在关闭时注销。服务和路由器的客户端查询服务注册表以查找服务的可用实例。服务注册中心可能会调用服务实例的健康检查 API 来验证它是否能够处理请求。2.3 服务元数据 (Service Metadata)
服务元数据是指包括服务端点(endpoints)、服务标签、服务版本号、服务实例权重、路由规则、安全策略等描述服务的数据2.4 服务提供方 (Service Provider)
是指提供可复用和可调用服务的应用方2.5 服务消费方 (Service Consumer)
是指会发起对某个服务调用的应用方2.6 配置 (Configuration)---配置文件中心
在系统开发过程中通常会将一些需要变更的参数、变量等从代码中分离出来独立管理,以独立的配置文件的形式存在。目的是让静态的系统工件或者交付物(如 WAR,JAR 包等)更好地和实际的物理运行环境进行适配。配置管理一般包含在系统部署的过程中,由系统管理员或者运维人员完成这个步骤。配置变更是调整系统运行时的行为的有效手段之一。2.7 配置管理 (Configuration Management)
在数据中心中,系统中所有配置的编辑、存储、分发、变更管理、历史版本管理、变更审计等所有与配置相关的活动统称为配置管理。2.8 名字服务 (Naming Service)
提供分布式系统中所有对象(Object)、实体(Entity)的“名字”到关联的元数据之间的映射管理服务,例如 ServiceName -> Endpoints Info, Distributed Lock Name -> LockOwner/Status Info, DNS Domain Name -> IP List, 服务发现和 DNS 就是名字服务的2 大场景。2.9 配置服务 (Configuration Service)
在服务或者应用运行过程中,提供动态配置或者元数据以及配置管理的服务提供者。3.NacosServer 的安装和启动
NacosServer 相当于 EurekaServer,只不过 eurekaServer 使我们自己搭建的一个项目,而 NacosServer 别人已经提供好了3.1 NacosServer 的下载
我们要对应版本,目前 alibaba 稳定版是 2.2.6.RELEASE地址: https://github.com/alibaba/nacos/releases/tag/2.2.3
下载起来比较慢,我这边已经下载好了
3.2 解压以及目录说明
3.3 修改配置文件【重点】
进入${Nacos}/conf 目录里面,使用文件编辑器打开 application.properties 文件,这里 面我使用的是 Nodepad++: VsCode打开后如图:
Nacos 默认使用嵌入式数据库实现数据的存储,并不方便观察数据存储的基本情况,这里面我们修改为使用 Mysql 数据库做数据的存储,方便我们观察数据的结构。
在配置文件末尾添加如下配置:spring.datasource.platform=mysql db.num=1 db.url.0=jdbc:mysql://localhost:3306/nacos?characterEncoding=utf8&connectTimeout=1 000&socketTimeout=3000&autoReconnect=true db.user=root db.password=123456
注意:上面的 url 地址是我的服务器地址,你们的就填写自己的地址。
3.4 Mysql 表的导入
在 config 目录下找到对应的 sql 脚本,提示:Nacos 建议使用 5.7 的 Mysql 数据库,版本较低或者较高可能存储兼容性问题 使用的 Mysql 数据库版本为 5.7创建数据库,运行 sql 脚本
3.5 NacosServer 的启动、
可以直接 startup.cmd -m standalone 启动单击版本 上面工作都完成后,现在我们来启动一个单机版的 Nacos 服务器。 进入到${Nacos}/bin 目录里面:使用 nodepad++打开 startup.cmd 修改默认参数 将 set MODE=”cluster”修改为 standalone
双击 startup.cmd 文件,完成 nacosServer 的启动。
http://localhost:8848/nacos ,即可访问启动 Nacos 实例。
启动报错:
nacos访问地址无登录界面问题:版本2.2.3
场景:
访问 localhost:8848/nacos 地址时,没有弹出登录界面,提示"当前集群没有开启鉴权,请参考文档开启鉴权~"。此时左边菜单也没有权限控制模块。
原因分析:
这是新版本的配置文件中鉴权开关没有开启的原因,具体可以修改以下配置项,按照如下配置即可
nacos.core.auth.enabled=true nacos.core.auth.server.identity.key=${NACOS_AUTH_IDENTITY_KEY:example} nacos.core.auth.server.identity.value=${NACOS_AUTH_IDENTITY_KEY:example} nacos.core.auth.plugin.nacos.token.secret.key=${NACOS_AUTH_TOKEN:SecretKey01234567890123456789012345345678999987654901234567890123456789}
重启服务,再次访问 localhost:8848/nacos, 搞定!默认账号nacos,密码nacos
Nacos 默认用户名和密码都是 nacos。
如果想修改密码,可以直接修改数据库的 user 表,密码可以使用 BcryptPasswordEncoder加密 输入正确的用户名和密码提交后,出现 Nacos 的控制台界面。
至此,Nacos Server 已经安装成功。
4.使用 Nacos 做注册中心
Maven新建07-nacos项目
4.1 搭建两个 nacos 的客户端
我们搭建 alibaba-nacos-consumer 和 alibaba-nacos-provider,就是一个消费者一个 提供者4.2 版本依赖【重点-再贴图一次】
这里点击上方 GitHub 上的下载大概率是很慢的,非常慢,这里推荐个快速下载 nacos 的地址 :
https://sourceforge.net/projects/nacos.mirror/
4.3 创建两个项目,选择依赖
这两个项目的依赖都是一样的,因为 springboot 更新原因,导致创建项目时选择不了低版本,所以直接贴出 pom 文件参考<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.tongda</groupId> <artifactId>nacos-client-a</artifactId> <version>0.0.1-SNAPSHOT</version> <name>01-nacos-client-a</name> <description>01-nacos-client-a</description> <properties> <java.version>1.8</java.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <spring-boot.version>2.7.6</spring-boot.version> <spring-cloud-alibaba.version>2021.0.5.0</spring-cloud-alibaba.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>${spring-boot.version}</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>${spring-cloud-alibaba.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>1.8</source> <target>1.8</target> <encoding>UTF-8</encoding> </configuration> </plugin> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>${spring-boot.version}</version> <configuration> <mainClass>com.tongda.Application</mainClass> <skip>true</skip> </configuration> <executions> <execution> <id>repackage</id> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
4.4 application.yml
两个配置文件基本一致,注意端口和应用名称server: port: 8080 spring: application: name: nacos-client-a cloud: nacos: #客户端注册的地址 server-addr: localhost:8848 # 往服务地址,注册自己 username: nacos password: nacos discovery: # 命名空间,可以做项目隔离 namespace: car-namespace group: dev # 在命名空间下的组别,可以用来细粒度的隔离
4.5 修改两个启动类
package com.tongda; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @SpringBootApplication @EnableDiscoveryClient // 开启服务发现客户端,也就是nacosServer的客户端 public class NacosClientAApplication { public static void main(String[] args) { SpringApplication.run(NacosClientAApplication.class, args); } }
4.6 给 02-nacos-client-b添加一个 controller
package com.tongda.controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class BController { @GetMapping("info") public String info() { return "20W"; } }
4.7 启动 02-nacos-client-b测试
启动后去看 nacosServer 的控制台,已经有实例注册上去了
4.8 给 01-nacos-client-a添加一个 controller,做服务发现
package com.tongda.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.web.bind.annotation.RestController; import java.util.List; @RestController public class TestController { @Autowired public DiscoveryClient discoveryClient; public String testDis() { List<ServiceInstance> instances = discoveryClient.getInstances("user-service"); System.out.println(instances); return "ok"; } }
4.9 启动 alibaba-nacos-consumer 测试
先查看 NacosServer 是否注册上线,注意:隔离,要统一分组才能相互发现
5.集成 openfeign 做远程调用和负载均衡
如果没有学 feign 的同学,可以使用 restTemplate 来做出处有坑
步骤回显
- 引入openfeign的依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
- 被调用的微服务提供接口
@RestController @RequestMapping("/test") public class CouponController { @RequestMapping("/list") public Result list(@RequestParam Map<String, Object> params){ PageUtils page = couponService.queryPage(params); return Result.ok().put("page", page); } }
- 调用方编写feign的接口
@FeignClient("test1-demo") public interface TestFeign { @RequestMapping("/test/list") Result list(); }
项目用的alibaba的nacos作为注册中心,故@FeignClient(“test1-demo”)的名称为被调用服务接口放的在nacos上的注册名称。
- 开启openFeign
只需要在启动类上如下注解就好了
@SpringBootApplication @EnableDiscoveryClient //加入如下注解,开启openFeign @EnableFeignClients public class Test2DemoApplication { public static void main(String[] args) { SpringApplication.run(Test2DemoApplication.class, args); } }
发现报错
缺少依赖,启动报错
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'com.bearjun.gulimail.member.feign.CouponFeign': Unexpected exception during bean creation; nested exception is java.lang.IllegalStateException: No Feign Client for loadBalancing defined. Did you forget to include spring-cloud-starter-loadbalancer? at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:537) ~[spring-beans-5.3.6.jar:5.3.6] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.6.jar:5.3.6] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.6.jar:5.3.6] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.6.jar:5.3.6] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.6.jar:5.3.6] at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) ~[spring-beans-5.3.6.jar:5.3.6] at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1380) ~[spring-beans-5.3.6.jar:5.3.6] at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1300) ~[spring-beans-5.3.6.jar:5.3.6] at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:657) ~[spring-beans-5.3.6.jar:5.3.6] ... 21 common frames omitted Caused by: java.lang.IllegalStateException: No Feign Client for loadBalancing defined. Did you forget to include spring-cloud-starter-loadbalancer? at org.springframework.cloud.openfeign.FeignClientFactoryBean.loadBalance(FeignClientFactoryBean.java:333) ~[spring-cloud-openfeign-core-3.0.2.jar:3.0.2]
问题分析
由于SpringCloud Feign在Hoxton.M2 RELEASED版本之后不再使用Ribbon而是使用spring-cloud-loadbalancer,所以不引入spring-cloud-loadbalancer会报错。
链接:https://blog.csdn.net/weixin_43556636/article/details/110653989
解决方法
加入spring-cloud-loadbalancer依赖 并且在nacos中排除ribbon依赖,不然loadbalancer无效
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-loadbalancer</artifactId> </dependency>
依赖冲突
java.lang.AbstractMethodError: org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient.choose(Ljava/lang/String;Lorg/springframework/cloud/client/loadbalancer/Request;)Lorg/springframework/cloud/client/ServiceInstance; at org.springframework.cloud.openfeign.loadbalancer.FeignBlockingLoadBalancerClient.execute(FeignBlockingLoadBalancerClient.java:88) ~[spring-cloud-openfeign-core-3.0.2.jar:3.0.2] at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:119) ~[feign-core-10.10.1.jar:na] at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:89) ~[feign-core-10.10.1.jar:na] at feign.ReflectiveFeign$FeignInvocationHandler.invoke(ReflectiveFeign.java:100) ~[feign-core-10.10.1.jar:na] at com.sun.proxy.$Proxy91.list(Unknown Source) ~[na:na] at com.bearjun.gulimail.member.controller.MemberController.list(MemberController.java:44) ~[classes/:na] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_261] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_261] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_261] at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_261] at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:197) ~[spring-web-5.3.6.jar:5.3.6] at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:141) ~[spring-web-5.3.6.jar:5.3.6] at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.3.6.jar:5.3.6] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894) ~[spring-webmvc-5.3.6.jar:5.3.6] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.6.jar:5.3.6] at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.6.jar:5.3.6] at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1060) ~[spring-webmvc-5.3.6.jar:5.3.6] at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:962) ~[spring-webmvc-5.3.6.jar:5.3.6] at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.6.jar:5.3.6] at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.6.jar:5.3.6] at javax.servlet.http.HttpServlet.service(HttpServlet.java:626) ~[tomcat-embed-core-9.0.45.jar:4.0.FR] at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.6.jar:5.3.6] at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.45.jar:4.0.FR] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227) ~[tomcat-embed-core-9.0.45.jar:9.0.45]...........
问题分析
nacos中 pring-cloud-starter-netflix-ribbon会与它冲突,造成loadbalanc包失效
解决方法
我们只需要再nacos的服务注册与发现的依赖中去掉ribbon
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <!-- 排除ribbon的依赖 --> <exclusions> <exclusion> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </exclusion> </exclusions> </dependency>
Maven显示中央仓库找不到spring-cloud-starter-alibaba-nacos-discovery,去阿里云镜像发现上面版本信息写的unknown,有点懵逼于是去MavenRepository找一下版本号,看一下与SpringCloud适配的版本,Nacos1.3,完事
版本不匹配解决方法如下:
com.alibaba.nacos.api.exception.NacosException: failed to req API解决方案
5.1 启动多台 alibaba-nacos-provider
我们可以再建一个项目,来达到多台 provider 的效果,我们也可以通过修改配置文件的方式多启动多台,我们这里选择在建一个项目,只有端口和 controller 输出改变,其他都不改变5.2.1 添加 openfeign 的依赖,注意还需要 cloud 的依赖管理,此处有坑可看前面避坑
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.tongda</groupId> <artifactId>nacos-client-a</artifactId> <version>0.0.1-SNAPSHOT</version> <name>01-nacos-client-a</name> <description>01-nacos-client-a</description> <properties> <java.version>1.8</java.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <spring-boot.version>2.6.13</spring-boot.version> <spring-cloud.version>2021.0.5</spring-cloud.version> <spring-cloud-alibaba.version>2021.0.5.0</spring-cloud-alibaba.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
<-- Openfeign避坑,必须loadbalancer一起导入依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-loadbalancer</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>${spring-boot.version}</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>${spring-cloud-alibaba.version}</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>1.8</source> <target>1.8</target> <encoding>UTF-8</encoding> </configuration> </plugin> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>${spring-boot.version}</version> <configuration> <mainClass>com.tongda.Application</mainClass> <skip>true</skip> </configuration> <executions> <execution> <id>repackage</id> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
问题分析
由于SpringCloud Feign在Hoxton.M2 RELEASED版本之后不再使用Ribbon而是使用spring-cloud-loadbalancer,所以不引入spring-cloud-loadbalancer会报错。
链接:https://blog.csdn.net/weixin_43556636/article/details/110653989
5.2.2 修改启动类,添加注解
package com.tongda; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.openfeign.EnableFeignClients; @SpringBootApplication @EnableDiscoveryClient // 开启服务发现客户端,也就是nacosServer的客户端 @EnableFeignClients // 开启Feign远程调用 public class NacosClientAApplication { public static void main(String[] args) { SpringApplication.run(NacosClientAApplication.class, args); } }
5.2.3 添加一个 feign 的接口,注意和提供者一致
package com.tongda.feign; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; @FeignClient(value = "user-service") // Feign远程调用提供者 public interface TestFeign { // 调用02-nacos-b中Bcontroller做接口 @GetMapping("info") public String info(); }
5.2.4 添加一个 controller
package com.tongda.controller; import com.tongda.feign.TestFeign; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; @RestController public class TestController { @Autowired public DiscoveryClient discoveryClient; @Autowired public TestFeign testFeign; @GetMapping("test") public String testDis() { List<ServiceInstance> instances = discoveryClient.getInstances("user-service"); System.out.println(instances); return testFeign.info(); // return "ok"; } }
5.2.5 启动测试
访问:http://localhost:8080/test 至此,nacos 做注册中心,服务发现,以及远程调用都完成了6.Nacos Discovery 对外暴露 Endpoint
Nacos Discovery 内 部 提 供 了 一 个 Endpoint, 对 应 的 endpoint id 为 nacos-discovery。我们通过该 Endpoint,能获取到: 当前服务有哪些服务订阅者 ; 当前应用 Nacos 的基础配置信息 ;6.1 给任意项目添加依赖
假设我们想看消费者的一些信息,我们给消费者添加<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
6.2 修改配置文件
Endpoint 本身对外界隐藏显示,我们需要在配置里面开启对 Endponit 的显示支持。 修改 application.yml 配置文件,在里面添加如下的配置:management: endpoints: web: exposoure: include: '*'说明: exposure.include:对外界保留那些 Endpoint,若是所有则使用* ;
6.3 启动项目访问查看效果
http://localhost:8001/actuator http://localhost:8001/actuator/nacosdiscovery
7.Nacos Discovery Starter 更多的配置项
配置项 | Key | 默认值 | 说明 |
---|---|---|---|
服务端地址 | spring.cloud.nacos.discovery.server-addr | 无 | NacosServer 启动监听的ip地址和端口 |
服务名 | spring.cloud.nacos.discovery.service | ${spring.application.name} | 给当前的服务命名 |
服务分组 | spring.cloud.nacos.discovery.group | DEFAULT_GROUP | 设置服务所处的分组 |
权重 | spring.cloud.nacos.discovery.weight | 1 | 取值范围 1 到 100,数值越大,权重越大 |
网卡名 | spring.cloud.nacos.discovery.networkinterface | 无 | 当IP未配置时,注册的IP为此网卡所对应的IP地址,如果此项也未配置,则默认取第一块网卡的地址 |
注册的IP地址 | spring.cloud.nacos.discovery.ip | 无 | 优先级最高 |
注册的端口 | spring.cloud.nacos.discovery.port | -1 | 默认情况下不用配置,会自动探测 |
命名空间 | spring.cloud.nacos.discovery.namespace | 无 | 常用场景之一是不同环境的注册的区分隔离,例如开发测试环境和生 产环境的资源(如配置、服务)隔离等。 |
AccessKey | spring.cloud.nacos.discovery.access-key | 无 | 当要上阿里云时,阿里云上面的一个云账号名 |
SecretKey | spring.cloud.nacos.discovery.secret-key | 无 | 当要上阿里云时,阿里云上面的一个云账号密码 |
Metadata | spring.cloud.nacos.discovery.metadata | 无 | 使用Map格式配置,用户可以根据自己的需要自定义一些和服务相关的元数据信息 |
日志文件名 | spring.cloud.nacos.discovery.metadataspring.cloud.nacos.discovery.log-name | 无 | |
集群 | spring.cloud.nacos.discovery.cluster-name | DEFAULT | 配置成Nacos集群名称 |
接入点 | spring.cloud.nacos.discovery.enpoint | UTF-8 | 地域的某个服务的入口域名,通过此域名可以动态地拿到服务端地址 |
是否集成Ribbon | ribbon.nacos.enabled | true | 一般都设置成true即可 |
是否开启Nacos Watch | spring.cloud.nacos.discovery.watch.enabled | true | 可以设置成false来关闭 watch |
1.服务端地址
spring.cloud.nacos.discovery.server-addr 无 Nacos Server 启动监听的 ip 地址和端口
2.服务名
spring.cloud.nacos.discovery.s ervice ${spring.application.name} 给当前的服务命名
3.服务分组
spring.cloud.nacos.discovery.group DEFAULT_GROUP 设置服务所处的分组
4.权重
spring.cloud.nacos.discovery.weight 1 取值范围 1 到 100 ,数值越大,权重越大
5.网卡名
spring.cloud.nacos.discovery.network-interface 无 当 IP 未配置时,注册的 IP 为此网卡所对应的 IP 地址,如果此项也未配置,则 默认取第一块网卡的地址
集群配置时,nacos、nacos1、nacos2,properties中修改数据库SQL、端口
8848\8849\8850,新建cluster.conf
编辑cluster.conf
注:避免中文目录
启动失败,发现端口占用
09【Nacos 配置文件中心】
1.Nacos 简介
使用 Spring Cloud Alibaba Nacos Config,可基于 Spring Cloud 的编程模型快速接入 Nacos 配置管理功能,动态服务发现为核心。
上一节 Spring Cloud Alibaba Nacos 注册中心记录了 Nacos 作为注册中心的使用方式,这节继续记录下 Nacos 作为配置中心的使用方式。本节使用的 Spring Cloud 版本为2021.0.5 , Spring Cloud Alibaba 版 本 为 2021.0.5.0, Spring Boot 版 本 为2.3.7.6。启动nacos,新建nacos配置文件
2.创建项目 config-client-a
2.1 创建项目选择依赖
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.tongda</groupId> <artifactId>nacos-config-a</artifactId> <version>0.0.1-SNAPSHOT</version> <name>04-nacos-config-a</name> <description>04-nacos-config-a</description> <properties> <java.version>1.8</java.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <spring-boot.version>2.7.6</spring-boot.version> <spring-cloud-alibaba.version>2021.0.5.0</spring-cloud-alibaba.version> <spring-cloud.version>2021.0.5</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-loadbalancer</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>${spring-boot.version}</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>${spring-cloud-alibaba.version}</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>1.8</source> <target>1.8</target> <encoding>UTF-8</encoding> </configuration> </plugin> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>${spring-boot.version}</version> <configuration> <mainClass>com.tongda.Application</mainClass> <skip>true</skip> </configuration> <executions> <execution> <id>repackage</id> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
修改Bootstrap.yml
# 应用服务 WEB 访问端口 server.port=8080 # Nacos帮助文档: https://nacos.io/zh-cn/docs/concepts.html # Nacos认证信息 spring.cloud.nacos.config.username=nacos spring.cloud.nacos.config.password=nacos spring.cloud.nacos.config.contextPath=/nacos # 设置配置中心服务端地址 spring.cloud.nacos.config.server-addr=mse-6d50f4f0-p.nacos-ans.mse.aliyuncs.com:8848 # Nacos 配置中心的namespace。需要注意,如果使用 public 的 namcespace ,请不要填写这个值,直接留空即可 # spring.cloud.nacos.config.namespace= spring.config.import=nacos:nacos-config-example.properties?refresh=true # Nacos帮助文档: https://nacos.io/zh-cn/docs/concepts.html spring.application.name=nacos-service # Nacos认证信息 spring.cloud.nacos.discovery.username=nacos spring.cloud.nacos.discovery.password=nacos # Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口 spring.cloud.nacos.discovery.server-addr=mse-6d50f4f0-p.nacos-ans.mse.aliyuncs.com:8848 # 注册到 nacos 的指定 namespace,默认为 public spring.cloud.nacos.discovery.namespace=public
指定读取哪个中心,账号密码,哪个命名空间,组中哪个文件格式信息。
# 应用服务 WEB 访问端口 server: port: 8081 spring: application: name: nacos-config-a cloud: nacos: config: # 项目在启动的时候去哪里找它对应的配置文件 server-addr: localhost:8848 username: nacos password: naocs # namespace: # 默认命名空间 # group: prefix: nacos-config-a # 默认${spring.application.name},调用哪个配置文件nacos-config-a file-extension: yml # 读取格式yml文件类型
此处有坑
查看SpringCloud Alibaba 2021版 nacos 配置中心教程得知,在该版本下原有的nacos配置文件获取规则不再生效需要改为spring.config.import的方式来配置,此种配置方式也支持多个配置文件的获取,配置参考如下
注意事项:
如果使用 spring.config.import
就不能使用 bootstrap.yml/properties
引入配置的方式了 !!!
如果引入了spring-cloud-starter-alibaba-nacos-config
,并且使用 import
方式导入配置,项目启动时会自动检测是否引入了 nacos:条目
,如果没有 import nacos
条目,会出现如下错误:
The spring.config.import property is missing a nacos: entry Action: Add a spring.config.import=nacos: property to your configuration. If configuration is not required add spring.config.import=optional:nacos: instead. To disable this check, set spring.cloud.nacos.config.import-check.enabled=false.
spring: application: name: order cloud: nacos: config: group: DEV_GROUP server-addr: 127.0.0.1:8848 namespace: c822f776-306c-4dd2-9612-68b697e3b240 username: nacos password: nacos discovery: server-addr: 127.0.0.1:8848 config: import: - optional:nacos:order.yml - optional:nacos:comm.yml?group=DEFAULT_GROUP&refreshEnabled=false
spring cloud2021.0.5版本nacos配置中心的使用总结
原有的bootstrap.yml配置文件不再生效,需要修改为application.yml的配置
# application.yml spring: cloud: nacos: config: group: DEFAULT_GROUP server-addr: 127.0.0.1:8848 config: import: - optional:nacos:test.yml # 监听 DEFAULT_GROUP:test.yml - optional:nacos:test01.yml?group=group_01 # 覆盖默认 group,监听 group_01:test01.yml - optional:nacos:test02.yml?group=group_02&refreshEnabled=false # 不开启动态刷新 - nacos:test03.yml # 在拉取nacos配置异常时会快速失败,会导致 spring 容器启动失败
# 应用服务 WEB 访问端口 server: port: 8083 spring: application: name: nacos-config-a cloud: nacos: config: # 项目在启动的时候去哪里找它对应的配置文件 server-addr: localhost:8848 prefix: nacos-config-a file-extension: yml # 配置文件类型 refresh-enabled: true # 动态刷新配置 username: nacos password: naocs # spring cloud2021.0.5后配置变更,需要以下方式导入nacos的配置文件 # config: # # 因为springboot 2.4版本以后默认关闭加载bootstrap.yml,所以只能通过此方式连接到nacos config # import: # nacos:${spring.application.name}.${spring.cloud.nacos.config.file-extension} # config: # import: # # 监听 # - optional:nacos:nacos-config-a.yml # # 开启动态刷新 # - optional:nacos:nacos-config-a.yml?group=DEFAULT_GROUP&refreshEnabled=true # namespace: # 默认命名空间 # group: # prefix: nacos-config-a # 默认${spring.application.name},调用哪个配置文件nacos-config-a # file-extension: yml # 读取格式yml文件类型
注意:
如果想保留以前的使用方式(bootstrap引入配置),需要添加依赖 pring-cloud-starter-bootstrap 依赖,不需要修改一行代码。
refreshEnabled参数要搭配@RefreshScope使用,如果没有使用@RefreshScope注解,就算配置了refreshEnabled=true也不会自动刷新。
refreshEnabled=false只是针对test02.yml这个配置文件在修改时不会自动刷新。如果test.yml中的参数和test02.yml所中的参数在同一个类中被使用且配置了@RefreshScope注解,那么在修改test02.yml后再修改test.yml会导致test02.yml被刷新。
2.2 在 NacosServer 里面添加一个配置文件
点击添加按钮:填写具体信息:
发布配置文件:
返回查看配置文件发布成功了
2.3 查看上一讲中创建的数据库中的信息
2.4 config-client-a 项目中添加一个配置文件 bootstrap.yml
正确案列配置
<!--Springboot版本管理--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.6.13</version> <type>pom</type> </dependency> <!--spring-cloud版本管理--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>2021.0.5</version> </dependency> <!--spring-cloud-alibaba版本管理--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2021.0.5.0</version> </dependency> <!--引入nacos服务--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!--引入nacos-config服务--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <!--bootstrap加载到上下文--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bootstrap</artifactId> </dependency>
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.tongda</groupId> <artifactId>nacos-config-a</artifactId> <version>0.0.1-SNAPSHOT</version> <name>04-nacos-config-a</name> <description>04-nacos-config-a</description> <properties> <java.version>1.8</java.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <spring-boot.version>2.7.6</spring-boot.version> <spring-cloud-alibaba.version>2021.0.5.0</spring-cloud-alibaba.version> <spring-cloud.version>2021.0.5</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!--引入nacos-config服务--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <!--bootstrap加载到上下文--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bootstrap</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>${spring-boot.version}</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>${spring-cloud-alibaba.version}</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>1.8</source> <target>1.8</target> <encoding>UTF-8</encoding> </configuration> </plugin> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>${spring-boot.version}</version> <configuration> <mainClass>com.tongda.Application</mainClass> <skip>true</skip> </configuration> <executions> <execution> <id>repackage</id> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
2)项目添加application.yml
bootstrap.yml
文件
spring: # 配置中心地址 application: # 服务名称 name: nacos-config-a # 环境配置 例如 admin-dev.yaml #profiles: # active: dev cloud: nacos: discovery: # 开启nacos作为服务注册中心,默认值:true enabled: true # nacos集群服务注册地址 server-addr: localhost:8848 # nacos用户名 username: nacos # nacos密码 password: nacos # 命名空间,默认 public,可设置dev,pro等,相同特征的服务分类,先去nacos命名空间创建 # namespace: public # 分组,默认 DEFAULT_GROUP 相同特征的服务划分的更细 group: DEFAULT_GROUP # 临时实例,默认true,false永久实例,即使宕机也不会从nacos服务中删除,可应对雪崩保护,避免服务被删除 ephemeral: true # 权重 1-100 数值越大权重越大分配的流量就越大,通常结合权重负载均衡策略 # weight: 100 config: server-addr: ${spring.cloud.nacos.discovery.server-addr} username: ${spring.cloud.nacos.discovery.username} password: ${spring.cloud.nacos.discovery.password} # dataid为yaml的文件扩展名配置方式 ${spring.application.name}.${file‐extension:properties} file-extension: yaml # namespace: group: DEFAULT_GROUP context-path: /nacos # 共享配置 #shared-configs: # - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
2.5 config-client-a 中添加一个实体类 Hero
package com.tongda.domain; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.stereotype.Component; @Data @AllArgsConstructor @NoArgsConstructor @RefreshScope // 刷新的域,当配置文件修改后可以动态刷新 @Component // 添加到 IOC 中,一会在 controller 注入 public class TongDa { @Value("${tongda.name}") private String name; @Value("${tongda.age}") private Integer age; @Value("${tongda.address}") private String address; }
2.6 config-client-a 中添加一个测试类 Controller
package com.tongda.controller; import com.tongda.domain.TongDa; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; @RestController public class TestController { @Resource public TongDa tongda; @GetMapping("info") public String getInfo(){ return tongda.getName()+":"+tongda.getAge()+":"+tongda.getAddress(); } }
2.7 启动测试
访问 http://localhost:8083/Info
2.8 测试配置文件的动态刷新
修改配置文件
不需要重启,直接请求 http://localhost:8083/Info 查看结果已经刷新了
2.9 配置文件的历史版本查询
2.10 配置文件的回滚
配置文件从上往下回滚,所以我们点击最上面的那一条 此时访问:http://localhost:8083/Info3.配置文件的读取方式【重点】
nacos 配置中心通过 namespace、dataId 和 group 来唯一确定一条配置。 Namespace:即命名空间。默认的命名空间为 public,我们可以在 Nacos 控制台中新建命名空间; dataId:即配置文件名称 Group : 即 配 置 分 组 , 默 认 为 DEFAULT_GROUP , 可 以 通 过spring.cloud.nacos.config.group 配置。 其中:dataId 是最关键的配置字段:格式如下: ${prefix} - ${spring.profiles.active} . ${file-extension} 说明: prefix 默 认 为 spring.application.name 的 值 , 也 可 以 通 过 配 置 项spring.cloud.nacos.config.prefix 来配置; spring.profiles.active 即 为 当 前 环 境 对 应 的 profile 。 注 意 , 当spring.profiles.active 为空时,对应的连接符-也将不存在,dataId 的拼接格式变成${prefix}.${file-extension}; file-extension 为 配 置 内 容 的 数 据 格 式 , 可 以 通 过 配 置 项spring.cloud.nacos.config.file-extension 来配置。 这就是上面我们为什么能获得到配置的原因了。 注意:在写 dataId 的时候一定要添加文件类型后缀Eg: nacos-config-dev.yml
例如:发布nacos-config-dev
5.获取多配置文件
除了通过上面的方式指定一个唯一配置外,我们还可以同时获取多个配置文件的内容。 提供这个功能 可以再次封装和抽象配置文件管理5.1 在 Nacos 中新建两个配置文件
在 powernode 命名空间,继续点击添加两个配置文件一般项目,先创建命名空间,在项目分组,项目id
新建配置:user-center-dev.yml,A组
再创建一个mamber-center-dev.yml,B组
同一项目,不同组
创建新项目,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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.tongda</groupId> <artifactId>nacos-config-test</artifactId> <version>0.0.1-SNAPSHOT</version> <name>05-nacos-config-test</name> <description>05-nacos-config-test</description> <properties> <java.version>1.8</java.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <spring-boot.version>2.7.8</spring-boot.version> <spring-cloud.version>2021.0.5</spring-cloud.version> <spring-cloud-alibaba.version>2021.0.5.0</spring-cloud-alibaba.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!--引入nacos-config服务--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <!--bootstrap加载到上下文--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bootstrap</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>${spring-boot.version}</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>${spring-cloud-alibaba.version}</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>1.8</source> <target>1.8</target> <encoding>UTF-8</encoding> </configuration> </plugin> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>${spring-boot.version}</version> <configuration> <mainClass>com.tongda.Application</mainClass> <skip>true</skip> </configuration> <executions> <execution> <id>repackage</id> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
bootstrap.yml优先级>大于application.yml
配置文件的读取优先级
本地配置文件:bootstrap.yml 先加载 application.yml后加载,application 也不会覆盖 bootstrap,而 application.yml 里面的内容可以动态替换。Spring Boot 中application.yml与bootstrap.yml的区别_application.yml 引用bootstrap.yml_keep one's resolveY的博客-CSDN博客
远程和本地配置文件的优先级:远程项目应用名配置文件 > 远程扩展配置文件 > 远程共享配置文件 > 本地配置文件。
如果我们想让本地最优先,可以在nacos配置文件中配置实现!
Spring Cloud Alibaba Nacos Config 提供了三种配置能力从 Nacos 拉取相关的配置
A:通过 spring.cloud.nacos.config.shared-configs[n].data-id 方式支持多个共享 dataId 配置
B:通过 spring.cloud.nacos.config.extension-configs[n]-data-id 方式支持多个扩展 dataId 配置
C:通过内部相关规则(应用名、应用名+Profile)自动生成相关的 dataId 配置
当三种方式同时使用时,它们的优先级关系:A < B < C,同理,若在这三种方式中配置了同样的参数时,则会使用 C 配置的参数值
spring: # 配置中心地址 application: # 服务名称 name: nacos-config-test # 环境配置 例如 admin-dev.yaml #profiles: # active: dev cloud: nacos: discovery: # 开启nacos作为服务注册中心,默认值:true enabled: true # nacos集群服务注册地址 server-addr: localhost:8848 # nacos用户名 username: nacos # nacos密码 password: nacos # 命名空间,默认 public,可设置dev,pro等,相同特征的服务分类,先去nacos命名空间创建 # namespace: public # 分组,默认 DEFAULT_GROUP 相同特征的服务划分的更细 group: DEFAULT_GROUP # 临时实例,默认true,false永久实例,即使宕机也不会从nacos服务中删除,可应对雪崩保护,避免服务被删除 ephemeral: true # 权重 1-100 数值越大权重越大分配的流量就越大,通常结合权重负载均衡策略 # weight: 100 config: server-addr: ${spring.cloud.nacos.discovery.server-addr} username: ${spring.cloud.nacos.discovery.username} password: ${spring.cloud.nacos.discovery.password} namespace: 918ccce6-801e-4014-8ed2-c2b6a30658c2 # dataid为yaml的文件扩展名配置方式 ${spring.application.name}.${file‐extension:properties} file-extension: yml # namespace: # group: DEFAULT_GROUP # context-path: /nacos extension-configs: - dataId: user-center-dev.yml group: A_GROUP refresh: true - dataId: member-center-dev.yml group: B_GROUP refresh: false # 共享配置 #shared-configs: # - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
此处有坑
配置文件的读取优先级
那么多配置文件,如果有重复的配置项,那么应该听从谁的?谁会覆盖谁呢?
- 通过内部相关规则(应用名、扩展名、profiles)自动生成相关的 Data Id 配置优先级最高
- nacos中的配置优先于本地配置,本地的bootstrap.yml>bootstrap.properties>application.yml>application.yaml>application.properties
- 扩展配置(extension-configs) > 共享配置(shared-configs)
- 同为扩展配置,存在如下优先级关系:extension-configs[3] > extension-configs[2] > extension-configs[1] > extension-configs[0]
- 同为共享配置,存在如下优先级关系:shared-configs[3] > shared-configs[2] > shared-configs[1] > shared-configs[0]
总的来说是:(线上) 服务名-profile.yml>服务名.yml>extension-configs[3]>extension-configs[2]>shared-configs[3]>(本地) shared-configs[2]>bootstrap.yml>bootstrap.properties>application.yml>application.yaml>application.properties
终极方案
有的配置可以通用于各个服务中,怎么共享使用呢?(shared-configs)
shared-configs: # 共享配置文件 - data-id: application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} group: DEFAULT_GROUP
所对应的配置名就是application-dev.yml
总结
标签:Spring,07Alibaba,nacos,springframework,Cloud,spring,org,config,cloud From: https://www.cnblogs.com/yayuya/p/17898333.html