微服务开发系列 第二篇:Nacos
总概
A、技术栈
- 开发语言:Java 1.8
- 数据库:MySQL、Redis、MongoDB、Elasticsearch
- 微服务框架:Spring Cloud Alibaba
- 微服务网关:Spring Cloud Gateway
- 服务注册和配置中心:Nacos
- 分布式事务:Seata
- 链路追踪框架:Sleuth
- 服务降级与熔断:Sentinel
- ORM框架:MyBatis-Plus
- 分布式任务调度平台:XXL-JOB
- 消息中间件:RocketMQ
- 分布式锁:Redisson
- 权限:OAuth2
- DevOps:Jenkins、Docker、K8S
B、源码地址
C、本节实现目标
- 项目[mall2]各server注册到Nacos服务,并通过Nacos服务名访问接口。
- 使用Nacos命名空间,创建dev_id/dev_name命名空间用于注册开发环境服务。
- 使用Naocs共享配置,将各个服务都需要用的配置抽取成common.yml。
- IDEA配置Active profiles
D、系列
E、版本说明
- Nacos:2.0.0
- spring-cloud.version:Hoxton.SR9
- spring-boot.version:2.3.6.RELEASE
- alibaba.cloud.version:2.2.3.RELEASE
F、Nacos地址
Nacos官网文档
Nacos官方GitHub地址
Nacos官方下载地址
G、Nacos部署环境
Nacos定义为一个IDC内部应用组件,并非面向公网环境的产品,建议在内部隔离网络环境中部署,强烈不建议部署在公共网络环境。
H、Nacos支持三种部署模式
- 单机模式 - 用于测试和单机试用。
- 集群模式 - 用于生产环境,确保高可用。
- 多集群模式 - 用于多数据中心场景
一、Nacos安装
可参考:
运行成功后访问:http://localhost:8848/nacos
。默认账号:nacos,密码:nacos
二、服务mall-member接入Nacos
2.1 加nacos依赖
服务mall-pom服务加入naocs依赖,mall-pom.xml:
<!-- 管理子类所有的jar包的版本,这样的目的是方便去统一升级和维护 -->
<dependencyManagement>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>${alibaba.cloud.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>${alibaba.cloud.version}</version>
</dependency>
<!-- 其他省略-->
</dependencyManagement>
<!-- 所有的子工程都会自动加入下面的依赖 -->
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- 其他省略-->
</dependencies>
2.2 yml配置
在mall-member服务的application-dev.yml配置中加入配置
spring:
application:
name: mall-member
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
2.3 重启mall-member服务查看nacos服务列表
mall-member服务其他server接入nacos同理。
三、Nacos命名空间
3.1 Nacos如何支持多环境
在日常使用中常常需要不同的环境,比如日常,预发,线上环境,如果是逻辑隔离可以使用命名空间,Nacos支持命名空间来支持多环境隔离,可以在Nacos控制台创建多个命名空间。如果需要物理隔离,就要部署多套Nacos环境。
3.2 配置Nacos命名空间
默认在Nacos中存在一个public命名空间,所有配置在没有指定命名空间时都在这个命名空间中获取配置,在实际开发时可以针对于不能环境创建不同的namespace空间。
注意:默认空间不能删除。
3.2.1 新增命名空间
新增命名空间g 创建命名空间【命名空间ID】如果在新增时没有填写的话,则Nacos服务端会自动随机产生一个命名空间ID。 每个命名空间都有一个唯一ID,这个ID是读取配置时指定空间的唯一标识。点击【确定】以后,在命名空间列表处会新增一行记录。
建议:正式项目中,建议将【命名空间ID】和【命名空间名】设置成相同,即都设置成dev。此处只是为了比较清晰的说明在yml配置文件中ID和名字的区别,才设置了不同的名字。
记录3.2.2 yml配置
在mall-member服务的application-dev.yml配置中加入配置
spring:
application:
name: mall-member
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
discovery:
namespace: dev_id
补充说明NO.1
有些文章会配置nacos用户名和密码,即如下所示:
spring:
application:
name: mall-member
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
username: nacos
password: abc123
discovery:
namespace: dev_id
其实这个用户名和密码是个Naocs的Dashboard登录用的,服务注册这里不需要配置,当然配置了也不会报错。
3.2.3 重启mall-member服务查看nacos服务列表
在dev_name命名空间下,显示了mall-member服务。
dev_name命名空间服务列表四、修改Nacos登录密码和登录名称
一般安装Nacos后登录密码默认都是nacos/nacos,但是在正式的生成环境这样肯定是不安全的。
4.1 Nacos单机默认内嵌的数据库
Nacos单机模式默认使用内嵌的数据库作为存储引擎,所以我们无法直接去修改数据,因此我们可以通过Nacos的Dashboard来修改密码。
修改密码 修改密码4.2 MySQL修改密码
4.2.1 查看Nacos源码加密方式
Nacos底层源码是BCryptPasswordEncoder加密器加密,我们这里使用该加密器就可以。
package com.alibaba.nacos.console.utils;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
public class PasswordEncoderUtil {
public static void main(String[] args) {
System.out.println(new BCryptPasswordEncoder().encode("nacos"));
}
public static Boolean matches(String raw, String encoded) {
return new BCryptPasswordEncoder().matches(raw, encoded);
}
public static String encode(String raw) {
return new BCryptPasswordEncoder().encode(raw);
}
}
使用 BCryptPasswordEncoder加密器加密
导入Security的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
加密得到密文
public class UserServerApplication {
public static void main(String[] args) {
System.out.println(new BCryptPasswordEncoder().encode("nacosDev"));
}
}
密文
4.2.2 构造用户,修改密码
复制到nacos的user表中password字段中,我这里构造了用户名:nacosDev,密码也是使用的nacosDev加密的密文。
修改密码使用设置的用户密码登录
登录
五、Nacos共享配置
日常开发中,多个模块可能会有很多共用的配置,比如数据库连接信息,Redis 连接信息,RabbitMQ 连接信息,监控配置等等。那么此时,我们就希望可以加载多个配置,多个项目共享同一个配置之类等功能,Nacos Config 也确实支持。
5.1 新建common.yml
登录Naocs平台,在命名空间dev_name下新建common.yml配置文件,将公共的配置抽取出来放到该配置中,如下:
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.100.51:3306/ac_db?serverTimezone=Asia/Shanghai&useUnicode=true&tinyInt1isBit=false&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true
username: ac_u
password: ac_PWD_123
#hikari数据库连接池
hikari:
pool-name: YH_HikariCP
minimum-idle: 10 #最小空闲连接数量
idle-timeout: 600000 #空闲连接存活最大时间,默认600000(10分钟)
maximum-pool-size: 100 #连接池最大连接数,默认是10
auto-commit: true #此属性控制从池返回的连接的默认自动提交行为,默认值:true
max-lifetime: 1800000 #此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认1800000即30分钟
connection-timeout: 30000 #数据库连接超时时间,默认30秒,即30000
connection-test-query: SELECT 1
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
common.yml配置文件
5.2 配置文件将application改成bootstrap
application.yml作用域在于当前应用有效,bootstrap.yml系统级别的配置有效(一般采用远程配置的时候才会用到)。
因此,将项目中原来的application.yml、application-dev.yml对应改成bootstrap.yml、bootstrap-dev.yml 。
5.3 修改mall-member服务配置
bootstrap-dev.yml
server:
port: 8080
spring:
application:
name: mall-member
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
namespace: dev_id
file-extension: yml
shared-configs:
- data-id: common.yml
group: DEFAULT_GROUP
refresh: true
discovery:
namespace: dev_id
swagger:
enabled: true
title: 用户服务
basePackage: com.ac.member.controller
version: 1.0
description: 用户服务相关接口
bootstrap.yml
spring:
profiles:
active: dev
mall-product等其他服务配置同理。
mall-member5.4 重启服务查看Nacos服务列表
image.png六、IDEA配置Active profiles
各个环境的配置文件(比如切换开发和测试),我们之前都是通过bootstrap.yml配置来切换的,如下:
spring:
profiles:
active: dev
一般在项目开发中,团队里的每个成员一般都会自己建立一套独立的命名空间,以免影响他人,如果每个人都来修改bootstrap.yml里的配置项,代码容易产生冲突,因此spring.profiles.active我们可以从bootstrap.yml中移除掉,在IDEA里进行配置。
配置 配置Active profiles重启服务,配置文件走的是dev环境。
六、Nacos配置MySQL数据库
参考官网:Nacos部署手册
6.1 前言
在 0.7 版本之前,在单机模式时 nacos 使用嵌入式数据库实现数据的存储,不方便观察数据存储的基本情况。0.7 版本后增加了支持 mysql 数据源能力。
6.2 Nacos配置MySQL
nacos 支持配置多个数据库,通过 db.num 和 db.url.index的配置来控制。nacos 配置 mysql 数据库只需如下三点即可完成:
- 安装数据库,版本要求:5.6.5+
- 初始化mysql数据库,数据库初始化文件:nacos-mysql.sql
- 修改conf/application.properties文件,增加支持mysql数据源配置(目前只支持mysql),添加mysql数据源的url、用户名和密码。
#*************** Config Module Related Configurations ***************#
### If use MySQL as datasource:
spring.datasource.platform=mysql
### Count of DB:
db.num=1
### Connect URL of DB:
db.url.0=jdbc:mysql://192.168.100.51:3306/ac_db?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=ac_u
db.password.0=ac_PWD_123
导入sql
导入sql成功
修改配置文件
6.3 验证
动Nacos 后,打开Nacos 管理界面,在命名空间模块,创建一个开发环境配置的命名空间dev_name ,如下图所示:
新建命名空间此时再查看我们的数据库表tenant_info中已有创建的dev_name记录了,如下图所示:
查询表