目录
一、服务注册与发现介绍
1、常见注册中心
2、服务注册与发现的基本流程是:
3、服务注册与发现的主要好处是:
二、Alibaba Nacos 介绍
三、Nacos基本使用
1.linux安装包方式单节点安装部署
1. jdk安装配置
2. nacos安装
2.Nacos集成SpringBoot实现服务注册与发现
1、创建父工程
2、创建基础公共模块(common)
3、创建用户模块(user-module)
4、将用户模块作为微服务注册到nacos
四、基于Feign实现服务调用
1) 什么是Feign
2) 负载均衡是啥意思
3) Feign的使用(创建订单模块 order)
1.创建订单模块,引入依赖
2.启动类加注解
3.yml文件配置
4.写个OrderController
5.给user模块的pom文件加入Fegin的依赖
6.给user模块在启动类上添加Fegin的注解
7.给user模块创建一个feign接口, 并使用Fegin实现微服务调用
8.controller调用并启动验证(user服务调用order服务)
五、Nacos 领域模型划分
1、命名空间划分
(1)创建命名空间
(2)配置微服务命名空间
2、group划分
六、日志配置
1、局部日志配置
方式一:
方式二
2、全局日志配置
(1)添加配置文件
(2)将springboot的日志级别调低
七、Nacos统一配置管理
一、为什么需要配置中心
二、常用的配置中心
Nacos 的几个概念
三、Nacos配置中心的使用
(一)properties格式
(二)yaml格式
(三)profiles.active—粒度配置
(四)自定义扩展的 Data Id 配置(共享配置)
(五)优先级
(六)动态配置刷新
服务注册与发现是微服务架构中最核心的组件之一。它的主要作用是管理服务与服务实例的信息,使服务消费者能够动态地找到提供所需服务的服务实例。
在微服务架构下,一个业务服务会被拆分成多个微服务,各个服务之间相互通信完成整体的功能。另外,为了避免单点故障,微服务都会采取集群方式的高可用部署,集群规模越大,性能也会越高,服务消费者要去调用多个服务提供者组成的集群。
首先,服务消费者需要在本地配置文件中维护服务提供者集群的每个节点的请求地址。其次,服务提供者集群中如果某个节点下线或者宕机,服务消费者的本地配置中需要同步删除这个节点的请求地址,防止请求发送到已宕机的节点上造成请求失败。
为了解决这类的问题,就需要引入服务注册中心,它主要有以下功能:
服务地址的管理。
服务注册。
服务动态感知。
能够实现这类功能的组件很多,比如ZooKeeper、Eureka Consul、Etcd、Nacos等。在这一章中主要介绍Alibaba的Nacos。
Eureka:Netflix 开源的服务注册与发现组件,Spring Cloud 将其集成,提供开箱即用的服务注册与发现功能。
Consul:HashiCorp 出品的服务网格方案 Consul 的一部分,提供服务注册与发现、配置管理、服务监控等功能。
Zookeeper:Apache 顶级项目,是一个树型的目录服务,支持变更推送,适合作为服务注册与发现组件。
Etcd:CoreOS 开发的一个分布式可靠键值存储,也常用作服务注册与发现存储介质。
Nacos:Nacos是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。它是 Spring Cloud Alibaba 组件之一,负责服务注册发现和服务配置,可以这样认为nacos=eureka+config。
服务启动时,向指定注册中心注册自己信息。信息包括服务名称、网络地址、端口号等。
服务消费者从注册中心获取所需服务信息,得到提供该服务的所有服务实例列表。
服务消费者基于某种负载均衡策略选择一个服务实例,发起调用。
服务实例停止时,向注册中心注销自己信息。
注册中心推送实例变更信息给消费者。
服务消费者无需硬编码服务实例地址,注册中心充当服务代理,实现松耦合。
服务提供者可以弹性扩展,而不会影响消费者。注册中心会推送变更信息给消费者。
易于监控和管理服务,通过注册中心可以看到系统中有哪些服务及其实例。
有助于实现灰度发布,可以在注册中心控制实例流量,进行平滑升级。
Nacos 是阿里巴巴开源的一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。它作为Spring Cloud Alibaba 微服务生态中的一个重要组件,主要提供以下功能:
服务发现和服务健康监测:支持基于 DNS 和基于 RPC 的服务发现,并提供实时的服务健康监测。
动态配置服务:支持 centralized configuration 和 Distributed configuration 两种模式,能够实时推送配置变更。
服务管理:提供服务编排管理、服务隔离、权重管理等服务管理功能。
Nacos 可以有三种部署模式:
单机模式:用于测试和开发环境,不支持集群。
集群模式:用于生产环境,支持集群部署,确保高可用。
Multi-DataCenter 模式:用于多数据中心场景,支持跨数据中心部署,确保最大程度容灾。
注:Nacos依赖Java环境,并且要求使用JDK1.8以上版本。
Nacos的安装方式有两种,一种是源码安装,另一种直接是使用已经编译好的安装包。这里选择使用安装包方式安装。
1)在 Linux 中安装和配置 JDK 需要以下步骤: 检查系统中是否已经安装过 JDK 和 JRE。可以使用以下命令来检查:
[root@localhost /]# java -version
2)如果系统中没有安装 JDK 和 JRE,则需要下载并安装 JDK。 参考 Oracle 官方网站,下载适合系统的 JDK 安装包。下载链接: Java Downloads | Oracle。 假设安装包为 /opt/jdk-11.0.11_linux-x64_bin.tar.gz。 解压安装包。可以使用以下命令:
tar -zxvf /opt/jdk-11.0.11_linux-x64_bin.tar.gz -C /opt/
3)配置环境变量。打开 /etc/profile 文件:
sudo vi /etc/profile
4)在文件末尾添加以下内容:
export JAVA_HOME=/opt/jdk-11.0.9 export PATH=$JAVA_HOME/bin:$PATH
5)然后保存并退出文件。执行以下命令使配置文件立即生效:
source /etc/profile
6)验证 JDK 是否安装配置成功。可以使用以下命令:
java -version
执行该命令后,应该能看到已经安装的 JDK 版本信息。
1)下载nacos的GitHub地址
2)解压Nacos安装包
tar -zxvf nacos-server-2.2.2.tar.gz
解压完成后,会在解压的目录中看到一个nacos的文件夹。
3)配置Nacos
进入解压后的nacos目录,修改conf/application.properties文件:
# 启用standalone模式(这个没有请自己添加)
nacos.standalone=true
# 修改端口号
server.port=8848
# 修改数据存储位置(XXX.XXX.XXX.XXX是网络中属性的IPv4地址,设置正确的数据库及用户名和密码)
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://XXX.XXX.XXX.XXX:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=your-db-username
db.password=your-db-password
4)启动Nacos服务 进入nacos跟目录,执行以下命令:
[root@bogon nacos]# sh bin/startup.sh -m standalone
这样,就会启动Nacos服务。在启动过程中,如果出现错误,可以查看logs目录下的startup.log文件来查看具体错误信息。
Error creating bean with name 'grpcSdkServer': Invocation of init method failed; nested exception is java.io.IOException: Failed to bind to address 0.0.0.0/0.0.0.0:9848
我当时就报这个错,总是关于9848端口的问题
我试了两种方法:
1.关掉服务:[root@localhost bin]# sh shutdown.sh 再重启服务试试。
2.还有的话就是:/nacos/conf/application.properties这个配置文件的问题
5)访问Nacos服务(xxx.xxx.xxx.xxx 使用 ip a 命令来查看IP地址) Nacos默认的访问地址为http://xxx.xxx.xxx.xxx:8848/nacos,可以在浏览器中输入该地址来访问Nacos服务。如果一切正常,将会看到Nacos的登录界面,输入默认账号(nacos)密码(nacos)即可登录。
至此,Nacos就成功安装完成了。
此时会发现一个问题:
跳过权限认证,不需要登录就进去了,可以看我之前写的一篇博客:开启鉴权
创建一个maven工程,然后在pom.xml文件中添加下面内容 各个版本的对应关系参考官网:官网版本对应关系描述地址
4.0.0
org.example
BK-SpringCloud
1.0-SNAPSHOT
spring-boot-starter-parent
org.springframework.boot
2.6.11
11
11
org.springframework.cloud
spring-cloud-dependencies
2021.0.4
pom
import
com.alibaba.cloud
spring-cloud-alibaba-dependencies
2021.0.4.0
pom
import
在pom.xml中添加依赖
BK-SpringCloud
org.example
1.0-SNAPSHOT
4.0.0
alibaba-common
11
11
org.springframework.boot
spring-boot-starter-web
mysql
mysql-connector-java
com.alibaba
druid-spring-boot-starter
1.2.15
org.mybatis.spring.boot
mybatis-spring-boot-starter
3.0.0
org.projectlombok
lombok
步骤:
1 创建模块 导入依赖
BK-SpringCloud
org.example
1.0-SNAPSHOT
4.0.0
alibaba-user
11
11
org.example
alibaba-common
1.0-SNAPSHOT
2 创建SpringBoot主类
@SpringBootApplication
public class UserApplication {
public static void main(String[] args) {
SpringApplication.run(UserApplication.class,args);
}
}
3 加入yml配置文件
spring:
application:
name: user-server
datasource:
druid:
url: jdbc:mysql://localhost:3306/nacos?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: 123456
接下来开始修改alibaba-user模块的代码, 将其注册到nacos服务上
1)在pom.xml中添加nacos的依赖
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
2)在主类上添加@EnableDiscoveryClient注解
@SpringBootApplication
@EnableDiscoveryClient
public class UserApplication {
public static void main(String[] args) {
SpringApplication.run(UserApplication.class,args);
}
}
3)在application.yml中添加nacos服务的地址
spring:
application:
name: user-server
datasource:
druid:
url: jdbc:mysql://localhost:3306/user?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: 123456
cloud:
nacos:
discovery:
username: nacos
password: nacos
server-addr: 192.168.177.129:8848
4)启动服务, 观察nacos的控制面板中是否有注册上来的用户微服务
Feign是声明式Web服务客户端,让微服务之间的调用变得更加简单。Feign内部封装了Ribbon和Hystrix,具有负载均衡和服务容错能力。
Feign的主要作用是通过创建接口并添加注解的方式来调用其他微服务。它采用接口的形式来调用其他微服务,结合Ribbon和Hystrix,实现了负载均衡和服务容错,大大简化了远程调用的复杂度。
使用Feign主要有以下好处:
隐藏服务调用的复杂性:Feign以声明式的方式通过定义接口的方式来调用服务,简化了开发人员直接调用服务的过程。
具有负载均衡能力:Feign内置了Ribbon负载均衡客户端,可以实现服务调用的负载均衡。
具有服务容错能力:Feign内置了Hystrix服务容错组件,在服务调用过程中,可以实现服务降级、服务熔断等服务容错功能。
支持多种服务调用方式:Feign内置了HTTP、TCP等多种服务调用方式,扩展性强。
具有请求重试机制:在指定的重试时间内,对服务进行重试调用,提高服务调用的稳定性。
支持GZIP压缩:发送GET请求时,支持对请求和响应进行GZIP压缩,提高网络传输效率。
支持记录日志:Feign支持使用SLF4J记录日志,便于服务调用的调试和跟踪。
主要使用步骤:
添加Feign依赖
创建服务接口并添加@FeignClient注解
使用接口直接调用服务
针对服务调用配置超时时间、重试次数等
定义服务降级Fallback类,在服务不可用时返回默认降级值
负载均衡(Load Balancing)是一种计算机技术,它通过将工作量分配到多个计算资源上实现最大化计算资源的利用效率。
在分布式系统中,多个服务实例的部署可以实现服务的高可用和可扩展性。通过负载均衡器,客户端的请求可以在服务实例之间进行分发,实现负载的均衡分配与管理。
测试: 启动两个User,(改端口,改控制器方法中的内容),通过调接口访问不容的内容。
SpringCloudAlibaba
com.buba
1.0-SNAPSHOT
4.0.0
order
11
11
com.buba
common
1.0-SNAPSHOT
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
@SpringBootApplication
@EnableDiscoveryClient
public class OrderApp {
public static void main( String[] args ) {
SpringApplication.run(OrderApp.class, args);
}
}
spring:
application:
name: order-server
datasource:
druid:
url: jdbc:mysql://localhost:3306/nacos?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: 123456
cloud:
nacos:
discovery:
username: nacos
password: nacos
server-addr: 192.168.177.129:8848
server:
port: ${random.int[0000,9999]}
@RestController
@RequestMapping("order")
public class OrderController {
@RequestMapping("/get1")
public Integer get1(){
return 111;
}
}
com.buba
common
1.0-SNAPSHOT
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
org.springframework.cloud
spring-cloud-starter-loadbalancer
org.springframework.cloud
spring-cloud-starter-openfeign
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients//开启Fegin
public class UserApp {
public static void main( String[] args ) {
SpringApplication.run(UserApp.class, args);
}
}
@FeignClient(value = "order-server",path = "/order")//声明调用的提供者的name
public interface OrderFeign {
// 指定调用提供者的哪个方法
// @FeignClient+@GetMapping 就是一个完整的请求路径 http://serviceproduct/product/{pid}
@GetMapping("/get1")
Integer get1();
}
@RestController
@RequestMapping("user")
public class UserController {
@Resource
private OrderFeign orderFeign;
@RequestMapping("/get1")
public Integer get1(){
return orderFeign.get1();
}
}
NameSpace(默认的NameSpace是”public“ NameSpace可以进行资源隔离,比如我们dev环境下的NameSpace下的服务是调用不到prod的NameSpace下的微服务)
dev 开发环境
test 测试环境
pre 生产环境
spring:
application:
name: order-server
cloud:
nacos:
discovery:
server-addr: 192.168.177.129:8848
namespace: 9f5444ba-f5a0-4745-99aa-e15e8cca08cd
spring:
cloud:
nacos:
discovery:
server-addr: 192.168.177.129:8848
group: group2
(1) 日志级别设置
注意:这里类上没有@Configuration注解
public class FeginConfig { @Bean public Logger.Level feignLoggerLevel(){ return Logger.Level.FULL; } }
(2) 配置目标feign
@FeignClient(value = "repository-server",path = "/repositoty",configuration = FeginConfig.class) public interface RepositotyFeign { @GetMapping("/getNum/{goodId}") Integer getNum(@PathVariable("goodId") Integer goodId); }
feign: client: config: repository-server: loggerLevel: debug
注意:这里类上有@Configuration注解
@Configuration public class FeginConfig { @Bean public Logger.Level feignLoggerLevel(){ return Logger.Level.FULL; } }
logging: level: com.buba.feign: debug
配置中心区别于传统的配置信息分散到系统各个角落的方式,对系统中的配置文件进行集中统一管理,而不需要逐一对单个的服务器进行管理。那这样做有什么好处呢?
(1)通过配置中心,可以使得配置标准化、格式统一化
(2)当配置信息发生变动时,修改实时生效,无需要重新重启服务器,就能够自动感知相应的变化,并将新的变化统一发送到相应程序上,快速响应变化。比方说某个功能只是针对某个地区用户,还有某个功能只在大促的时段开放,使用配置中心后只需要相关人员在配置中心动态去调整参数,就基本上可以实时或准实时去调整相关对应的业务。
(3)通过审计功能还可以追溯问题
微服务中配置中心的主流解决方案主要有三种:Nacos、Apollo、Config+Bus,不过里我们主要介绍 Nacos 作为配置中心的用法。
命名空间(Namespace) 命名空间可用于进行不同环境的配置隔离。一般一个环境划分到一个命名空间 配置分组(Group) 配置分组用于将不同的服务可以归类到同一分组。一般将一个项目的配置分到一组 配置集(Data ID) 在系统中,一个配置文件通常就是一个配置集。一般微服务的配置就是一个配置集
使用nacos作为配置中心,其实就是将nacos当做一个服务端,将各个微服务看成是客户端,我们将各个微服务的配置文件统一存放在nacos上,然后各个微服务从nacos上拉取配置即可。
1、导入依赖
com.alibaba.cloud spring-cloud-starter-alibaba-nacos-config org.springframework.cloud spring-cloud-starter-bootstrap
2、在配置中心+号新建配置
3、修改配置文件名
将项目中 application.yml 修改为 bootstrap.yml
4、在微服务中添加nacos config服务地址的配置
5、测试获取注册中心的配置
@RestController @RequestMapping("user") public class UserController { @Value("${author}") private String author; @RequestMapping("/get1") public String get1(){ return author; } }
6、可以将数据库的配置移至配置中心,并修改工程中数据源的配置
spring.datasource.druid.url=jdbc:mysql://localhost:3306/nacos?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai spring.datasource.druid.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.druid.username=root spring.datasource.druid.password=123456
当然配置中心配置了,yml文件中就删掉。
7、新增配置类
@Configuration public class DataSourceConfig { @Value("${spring.datasource.druid.username}") private String username; @Value("${spring.datasource.druid.password}") private String password; @Value("${spring.datasource.druid.url}") private String url; @Value("${spring.datasource.druid.driver-class-name}") private String driverClassName; @Bean public DataSource dataSource(){ DruidDataSource druidDataSource = new DruidDataSource(); druidDataSource.setUrl(url); druidDataSource.setUsername(username); druidDataSource.setPassword(password); druidDataSource.setDriverClassName(driverClassName); return druidDataSource; } }
可以打断点进行测试,是否获取到dataSource
1、配置中心新建配置
2、修改工程配置文件名为bootstrap.yml并修改配置文件配置
1、配置中心创建配置
Data ID: 服务名-profileN名.后缀名(order-server-mysql.yaml)
2、工程模块配置
spring: application: name: user-server cloud: nacos: discovery: # 服务注册与发现 username: nacos password: nacos server-addr: 192.168.177.129:8848 config: # 配置中心 username: nacos password: nacos server-addr: 192.168.177.129:8848 file-extension: yaml group: group1 # 分组 namespace: 9f5444ba-f5a0-4745-99aa-e15e8cca08cd # 命名空间 profiles: active: mysql # 粒度配置 server: port: ${random.int[1000,9999]} feign: client: config: default: # 全局,如果单个服务,写服务名称即可(user-server) #建立连接所用的时间,适用于网络状况正常的情况下,两端连接所需要的时间 connect-timeout: 5000 #指建立连接后从服务端读取到可用资源所用的时间 read-timeout: 5000
当我们微服务的数量越来越多,势必会有相同的配置,这时我们可以将相同的配置抽取出来作为项目中共有的配置,比如集群中的数据源信息、日志的配置信息,nacos 也是支持这种一个配置中心多个配置集这种写法的。
案例演示:
1、在nacos中新建两个 Data ID 分别是 redis.yaml 和 mysql.yaml 的文件。
2、在配置文件中分别加入部分配置内容
redis.yaml
mysql.yaml
**3、在 Springboot 项目中添加如下的 nacos 配置:**
整个yml配置:
spring: application: name: user-server cloud: nacos: discovery: # 服务注册与发现 username: nacos password: nacos server-addr: 192.168.177.129:8848 config: # 配置中心 username: nacos password: nacos server-addr: 192.168.177.129:8848 file-extension: yaml extension-configs[0]: # 多个 Data Id的配置 data-id: redis.yaml group: DEFAULT_GROUP # 默认为DEFAULT_GROUP refresh: true # 是否动态刷新,默认为false extension-configs[1]: data-id: mysql.yaml group: DEFAULT_GROUP # 默认为DEFAULT_GROUP refresh: true # 是否动态刷新,默认为false # group: group1 # 分组 # namespace: 9f5444ba-f5a0-4745-99aa-e15e8cca08cd # 命名空间 profiles: active: mysql # 粒度配置
提示1:多个 Data Id 同时配置时,他的优先级关系是 spring.cloud.nacos.config.ext-config[n].data-id 其中 n 的值越大,优先级越高。
提示2:spring.cloud.nacos.config.ext-config[n].data-id 的值必须带文件扩展名,文件扩展名既可支持 properties,又可以支持 yaml/yml。 此时 spring.cloud.nacos.config.file-extension 的配置对自定义扩展配置的 Data Id 文件扩展名没有影响。
Nacos Config 目前提供了四种配置能力从 Nacos 拉取相关的配置
A: 通过 spring.cloud.nacos.config.shared-configs[0].dataids 支持多个共享 Data Id 的配置
B: 通过 spring.cloud.nacos.config.extension-configs[0].data-id 的方式支持多个扩展 Data Id 的配置
C: 应用名 user-server.yaml 应用配置
D: 应用名+ Profile user-server-dev.yaml 粒度配置
# 优先级: 粒度配置 > 应用配置 > extension-configs[n]配置(n越大优先级越高) > shared-configs[n]配置(n越大优先级越高) D > C > B > A
注解方式(推荐)
@RestController @RefreshScope // 在需要动态读取配置的类上添加此注解就可以(动态配置刷新) @RequestMapping("/nacos-config") public class NacosConfigController { @Value("${config.appName}") private String appName; //2 注解方式 @GetMapping("/test") public String nacosConfingTest() { return appName; } }