SpringCloud Alibaba之Nacos
要点:
说明:
一:SpringCloud Alibaba - Nacos:注册中心(服务发现/注册)
二:SpringCloud Alibaba - Nacos:配置中心(动态配置管理)
三: 项目地址
文章目录
前言
SpringCloud 痛点:- SpringCloud 部分组件停止维护和更新,给开发带来不便;
- SpringCloud部分环境搭建复杂,没有完善的可视化界面,我们需要大量的二次开发和定制
- SpringCloud 配置复杂,难以上手,部分配置差别难以区分和合理应用
阿里使用过的组件经历了考验,性能强悍,设计合理,
现在开源出来大家用成套的产品搭配完善的可视化界面开发运维带来极大的便利搭建简单,学习曲线低。
以下是本篇文章正文内容,本文案例放在码云上
一、版本说明
spring-cloud-alibaba官网入口
中文版本入口
-
使用springboot和springcloud要注意版本适配
-
boot和cloud版本适配图
二、SpringCloud Alibaba-Nacos[作为注册中心]
友情通道
Nacos文档地址
下载 nacos-server入口
0.Nacos 说明
Nacos 是阿里巴巴开源的一个更易于构建云原生应用的动态服务发现、配置管理和服务管理 平台。
他是使用 java 编写。需要依赖 java 环境
0.先放一张友情图解(刚整合很容易弄混)
1.公共微服务引入版本控制和依赖
如下(最好在微服务都依赖的公共微服务引入):
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<!--统一版本控制版本,小编使用2.1.0的-->
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!- nacos注册中心 /服务注册功能 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
2.下载Nacos服务器
使用步骤:
- 双击 bin 中的 startup.cmd 文件
- 访问 http://localhost:8848/nacos/
- 使用默认的nacos/nacos 进行登录
如图
3.在使用nacos的微服务编配配置文件
小编使用yml格式的配置文件(文章第三部分有完整配置内容)
spring:
#springcloud-nacos地址
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
#微服务的应用名(必须取,不然nacos无法注册)
application:
name: gulimall-coupon
4.在启动类使用注解开启
使用
@EnableDiscoveryClient
开启服务注册发现功能(如图)
5.在nacos可视化界面查看
启动微服务,在nacos可视化界面查看(服务管理-服务列表)
附.如何解决端口占用
6.使用openFeign在远程调用
补充:feign已经闭包,所有使用openFeign
- 准备俩个微服务(小编使用小编的domo说明):gulimall-coupon和gulimall-member
- 在
gulimall-coupon
微服务中的controller写一个方法
//R是自己的工具类,返回json消息的。随便个测试的
@RequestMapping("/member/list")
public R membercoupons(){
CouponEntity couponEntity = new CouponEntity();
couponEntity.setCouponName("满5减6");
return R.ok().put("coupons",Arrays.asList(couponEntity));
}
- 微服务远程调用gulimall-coupon的方法
gulimall-member
编写创建一个包名feign编写要远程调用的方法(如图--对比2和4的方法名称--好理解
)
- 在
gulimall-member
微服务编一个controller远程调用在gulimall-coupon的controller的方法
//说明:R可以叫responseJson--单纯就是封装返回的json数据的工具类(自己编写设定的)
//注入
@Autowired
CouponFeignService couponFeignService;
//方法
@RequestMapping("/coupons")
public R test(){
MemberEntity memberEntity = new MemberEntity();
memberEntity.setNickname("张三");
//在此处调用
R membercoupon = couponFeignService.membercoupon();
Object coupons = membercoupon.get("coupons");
return R.ok().put("member",memberEntity).put("coupons",coupons);
}
-
在
gulimall-member
微服务的启动类上使用注解启动(basePackages的位置是声明要调用方法放的位置)@EnableFeignClients(basePackages=“com.atguigu.gulimall.member.feign”)
-
访问接口远程调用(调用成功如图)
-
补充说明:这俩个微服务都必须注册到nacos里面
7.官网更多配置示例入口
三、SpringCloud Alibaba - Nacos:配置中心
3个配置文件(大家也可以写成2个–整合application.properties和application.yml)
1.公共微服务引入依赖
<!-- 配置中心来做配置管理-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2.创建bootstrap.properties 配置文件
使用案例说明的微服务是gulimall-coupon
说明:
bootstrap.properties比application.properties优先读取
在应用的 /src/main/resources/bootstrap.properties 配置文件中
配置 Nacos Config 元数据
spring.application.name=gulimall-coupon
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
3.在application.properties中编写配置
说明:在application.properties编写配置,在controller读取,我们在nacos的配置中心就可以使用(配置文件-配置列表)添加配置文件,实时替换要读取的内容。
好处:如果需要修改配置文件只要在nacos配置中心修改,不需要重启微服务(应用)
#application.properties内容
coupon.user.name=zhangsan
coupon.user.age=18
controller读取
@Value("${coupon.user.name}")
private String name;
@Value("${coupon.user.age}")
private String age;
@RequestMapping("test")
public R test(){
return R.ok().put("name",name).put("age",age);
}
在controller类上面使用@RefreshScope
@RefreshScope说明: 让nacos配置中心时时刷新properties内容
3.在nacos可视化界面配置文件,替换application.properties的内容
小编使用图示
4.在bootstrap.properties文件补充配置
完整代码如下(springboot2.0以上版本将config改成了configs
)
spring.application.name=gulimall-coupon
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
#基于开发环境隔离
#spring.cloud.nacos.config.namespace=0bd4ca03-b074-49a5-8a9e-51f53ecce4a0
#基于微服务隔离
spring.cloud.nacos.config.namespace=cd8a174f-5d11-4a61-8020-fa0f13b14569
5.访问在controller编写的测试方法
发现读取的配置文件已经实时刷新了
(配置中心有的,优先读取,没有在读取应用本身配置的)
6.项目实际用法(基于微服务隔离-在指定组)
小编直接图示,在附在代码
nacos配置中的配置图
添加名称空间-在添加配置
在bootstrap.properties文件中指定
1、指定nacos地址和应用名
2、指定空间
3、指定组
4、细分配置-同时加载多个配置文件
bootstrap.properties完整的文件内容
spring.application.name=gulimall-coupon
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
#基于开发环境隔离
#spring.cloud.nacos.config.namespace=0bd4ca03-b074-49a5-8a9e-51f53ecce4a0
#基于微服务隔离
spring.cloud.nacos.config.namespace=cd8a174f-5d11-4a61-8020-fa0f13b14569
#指定组(没有指定的话加载配置中心默认分组,没有默认分组的话,加载项目配置的)
spring.cloud.nacos.config.group=dev
#细分配置-同时加载多个配置文件
#springboot2.0吧config改成configs
#指定组
spring.cloud.nacos.config.ext-config[0].group=dev
#加载配置
spring.cloud.nacos.config.ext-config[0].data-id=datasource.yml
#实时刷新(默认是false)
spring.cloud.nacos.config.ext-config[0].refresh=true
spring.cloud.nacos.config.ext-config[1].group=dev
spring.cloud.nacos.config.ext-config[1].data-id=mybaits.yml
spring.cloud.nacos.config.ext-config[1].refresh=true
spring.cloud.nacos.config.ext-config[2].group=dev
spring.cloud.nacos.config.ext-config[2].data-id=other.yml
spring.cloud.nacos.config.ext-config[2].refresh=true
附上小编的配置集application.yml
配置完nacos配置中心这个文件就可以注释掉了
spring:
#数据源
datasource:
username: root
password: root
url: jdbc:mysql://192.168.56.10:3306/gulimall_sms
driver-class-name: com.mysql.jdbc.Driver
#springcloud
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
#命名空间
application:
name: gulimall-coupon
#mybatis-plus:
mybatis-plus:
mapper-locations: classpath:/mapper/**/*.xml
#自增主建
global-config:
db-config:
id-type: auto
#端口
server:
port: 7000
7、启动微服务如果报错
com.alibaba.nacos.api.exception.NacosException:
java.lang.reflect.InvocationTargetException
那就是你没有在bootstrap.properties
文件中指定应用名称和地址
spring.application.name=gulimall-coupon
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
8、指定命名空间的方法
#服务地址-注册中心
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
#服务地址-配置中心
spring.cloud.nacos.config.server-addr=${spring.cloud.nacos.discovery.server-addr}
#服务命名空间-注册中心
spring.cloud.nacos.discovery.namespace=fa18a334-cb75-4661-96a0-94727342018d
#服务命名空间-配置中心
spring.cloud.nacos.config.namespace=${spring.cloud.nacos.discovery.namespace}
#声明从配置中心中读取的配置文件格式默认propertiess
spring.cloud.nacos.config.file-extension:propertiess
总结
/**
* 1、如何使用nacos作为配置中心统一管理配置
* 1)、引入依赖
* <!-- 配置中心来做配置管理-->
* <dependency>
* <groupId>com.alibaba.cloud</groupId>
* <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
* </dependency>
* 2)、创建一个bootstrap.properties文件
* 内容如下:
* spring.application.name=gulimall-coupon
* spring.cloud.nacos.config.server-addr=127.0.0.1:8848
* 3)、需要给配置中心默认添加一个叫数据集(Data Id) gulimall-coupon.properties 默认规则-> (应用名.properties)(输入日志头一句就有写)
*
* 4)、给应用名.properties添加任何配置
* 5)、动态获取配置
* @RefreScope:动态获取并刷新配置
* @Value("${配置项的命}"):获取到配置
* 如果配置中心和当前应用的配置文件都配置了相同的项,优先使用配置中心的配置
*
* 2、细节
* 1)、命名空间:配置隔离
* 默认:public(保留空间):默认新增的所有配置都在public空间
* 1、开发,测试,生产:利用命名空间来做环境隔离
* 注意:在bootstrap.properties:配置上需要使用哪个命名空间下的配置
* spring.cloud.nacos.config.namespace=0bd4ca03-b074-49a5-8a9e-51f53ecce4a0
* 2、每一个微服务之间来互相隔离配置,每一个微服务都创建自己的命名空间,只加载自己的命名空间的所有配置
*
* 2)、配置集:所有的配置的集合(一个概念)
*
* 3)、配置集ID:类似于文件名。
* Data ID:类似于文件名。
*
* 4)、配置分组
* 默认所有的配置集都属于:DEFAULT_GROUP
* 可以自己创建组,在分环境使用(在bootstrap.properties指定)
* spring.cloud.nacos.config.group=test_group
*
* 项目中使用:每个微服务创建自己的命名空间,使用配置分组来区分: dev , test ,prod
*
* 3、同时加载多个配置集
* 1)、微服务任何配置信息,任何配置文件都可以放在配置中心中
* 2)、只需要在bootstrap.properties中说明加载配置中心那些配置文件即可
* 3)、@Value,@ConfigurationProperties。。。
* 以前springboot任何方式从获取配置文件中获取值,都能使用
*
* 配置中心有的,优先使用配置中心的
*/
核心概念:
命名空间
: 用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
配置集
:
一组相关或者不相关的配置项的集合称为配置集。在系统中,一个配置文件通常就是一个配置集,包含了系统各个方面的配置。例如,一个配置集可能包含了数据源、线程池、日志级别等配置项。
配置集 ID
:
Nacos 中的某个配置集的 ID。配置集 ID 是组织划分配置的维度之一。Data ID 通常用于组织划分系统的配置集。一个系统或者应用可以包含多个配置集,每个配置集都可以被一个有意义的名称标识。Data ID 通常采用类 Java 包(如 com.taobao.tc.refund.log.level)的命名规则保证全局唯一性。此命名规则非强制
配置分组
:
Nacos 中的一组配置集,是组织配置的维度之一。通过一个有意义的字符串(如 Buy 或Trade )对配置集进行分组,从而区分 Data ID 相同的配置集。当您在 Nacos 上创建一个配置时,如果未填写配置分组的名称,则配置分组的名称默认采用 DEFAULT_GROUP 。配置分组的常见场景:不同的应用或组件使用了相同的配置类型,如 database_url 配置和MQ_topic 配置。
原理:
自动注入:
NacosConfigStarter
实现org.springframework.cloud.bootstrap.config.PropertySourceLocator
接口,并将优先级设置成了最高。
在 Spring Cloud 应用启动阶段,会主动从 Nacos Server 端获取对应的数据,并将获取到的数据转换成 PropertySource 且注入到 Environment 的 PropertySources 属性中,
所以使用@Value 注解也能直接获取 Nacos Server 端配置的内容
动态刷新:
Nacos Config Starter
默认为所有获取数据成功的 Nacos 的配置项添加了监听功能,
在监听到服务端配置发生变化时会实时触发org.springframework.cloud.context.refresh.ContextRefresher 的 refresh 方法 。
如果需要对 Bean 进行动态刷新,请参照 Spring 和 Spring Cloud 规范。
推荐给类添加@RefreshScope 或 @ConfigurationProperties 注解
nacos小结完成:
本文介绍了Nacos的使用,如果有不足之处,请留言评论