SpringCloud系列
SpringCloud-9、Sleuth+Zipkin
SpringCloud-8、Gateway网关服务
SpringCloud-7_OpenFeign服务调用
SpringCloud-6_Ribbon负载均衡
SpringCloud-5_模块集群化
文章目录
- SpringCloud系列
- Nacos基础
- Nacos是什么?
- Nacos下载&运行
- 创建Nacos服务提供者
- 需求说明/图解
- 创建member-service-nacos-provider-10004并注册到NacosServer8848
- 创建member-service-nacos-provider-10004
- 修改父项自pom.xml(无需实际操作)
- 修改本模块pom.xml
- 创建application.yml
- 创建主启动类
- 为看到更好提示,修改Controller
- 测试
- 创建member-service-nacos-provider-10006并注册到NacosServer8848
- 创建Nacos的服务消费者
- 创建member-service-nacos-consumer-80并注册到NacosServer8848,步骤:
- Nacos AP和CP切换
- 各种注册中心对比
- 选择AP还是CP?
- AP和CP切换
- Nacos配置中心实例
- 需求分析/图解
- 在Nacos Server加入配置
- 创建Nacos配置客户端模块e-commerce-nacos-config-client5000
- 标题Nacos分类配置(实现配置隔离)
- DatalD方案
- Group:方案
- Namespace方案
- Namespace/Group/Data ID关系梳理
Nacos基础
官网
Nacos文档
Nacos是什么?
一句话:Nacos就是注册中心[替代Eureka]+配置中心[替代Config]
Nacos:Dynamic Naming and Configuration Service
Nacos:架构理论基础:CAP理论(支持AP和CP可以切换)
Nacos下载&运行
下载:https:/github.com/alibaba/nacos/releases/tag/1.2.1
环境要求:Java8/Maven3.2.x+
解压,双击即可运行bin/startup.cmd(Windows命令脚本)
浏览器http:/localhost:8848/nacos
用户名/密码均为 nacos
在cmd(需要管理员身份运行)使用指令netstat -anb | more 查看8848端口是否正在监听
创建Nacos服务提供者
需求说明/图解
- 先完成服务端provider的创建
创建member-service-nacos-provider-10004并注册到NacosServer8848
创建member-service-nacos-provider-10004
注意创建前先选中总项目,再new Module/maven/member-service-nacos-provider-10004。否则可能创建到子项目里面去了。
创建完成后,检查:
1、检查自身的pom.xml,是不是在父项目里面:
e-commerce-center
2、检查父项目的pom.xml,查看是不是纳入了父项目的聚合管理
member-service-provider-10000
member-service-nacos-provider-10004
修改父项自pom.xml(无需实际操作)
1、引入nacos的代码由来,官方文档,3.2 How to Introduce Nacos Discovery for service registration/discovery
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
2、需要spring-cloud-alibaba-dependencies依赖,之前已经引入过,这儿仅仅是再强调一下,可以在官网看到该代码:2. Dependency Management
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
修改本模块pom.xml
参考member-service-provider-10000的pom.xml文件,进行引用,区别在于10000是用的eureka,改成nacos就行了
<dependencies>
<!--引入nacos-starter场景启动器-->
<!--比老师的多了一个starter,因为文档有,先尝试,不对删除-->
<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-web</artifactId>
</dependency>
<!--说明:starter-actuator是springboot程序的监控系统,可实现系统的健康检测
可以通过http://localhost:10000/actuator看到相关的连接和信息-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--引入mybatis,整合到springboot-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<!--引入druid-spring-boot-starter,这个和druid不一样,因为父项目没有,不指定版本会报错-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.17</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</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>
</dependency>
<dependency>
<groupId>com.stein.springcloud</groupId>
<artifactId>e-commerce-center-common-api</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
创建application.yml
接下来的启动类和yml我们都复制member-service-provider-10000的文件来进行修改即可。
我们直接从文件夹复制main/java和resources到nacos下,其原有空文件夹直接删除。这样做的原因,我个人理解为,直接在IDEA里面复制,会更改文件的引用和关联,反而会出现一些问题,不如文件复制来得安全。
然后修改application.yml
修改端口为: port: 10004
修改名称为:name: member-service-nacos-provider ,便于区分各模块
删除这儿不需要的zipkin和sleuth的配置
删除eureka的配置
配置nacos
最终结果如下:
server:
port: 10004
spring:
application:
name: member-service-nacos-provider #配置应用的名称。可以自定义,这儿保持一致了
datasource:
type: com.alibaba.druid.pool.DruidDataSource #指定使用的数据源
url: jdbc:mysql://localhost:3306/e_commerce_center_db?useSSL=true&useUnicode=true&characterEncoding=utf-8
username: root
password: root
cloud:
nacos: #配置nacos
discovery:
server-addr: localhost:8848 #配置Nacos Server的地址
mybatis:
mapper-locations: classpath:mapper/*.xml #指定mapper.xml文件位置
type-aliases-package: com.stein.springcloud.entity #指明实体类所在包别名,可以通过类名直接引用
#配置暴露所有的监控点
management:
endpoints:
web:
exposure:
include: '*'
创建主启动类
原有启动类需要删除eureka的注解和更改类名,所以直接删了重新创建一个
//启用Nacos发现注解
@EnableDiscoveryClient
@SpringBootApplication
public class MemberNacosProviderApplication10004 {
public static void main(String[] args) {
SpringApplication.run(MemberNacosProviderApplication10004.class,args);
}
}
为看到更好提示,修改Controller
修改Controller的一句语句即可
//String msg="本次任务由member-service-provider-10000执行";
String msg="本次任务由member-nacos-provider-10004执行";
测试
启动Nacos Server 8848。即软件bin/startup.cmd(Windows命令脚本),并通过浏览器http:/localhost:8848/nacos查看是否正确运行。
启动member-service-nacos-provider-10004
观察nacos服务是否注册成功
浏览器:
http://localhost:10004/member/get/1
可以在http://localhost:8848/nacos的页面下,服务管理/服务列表下看到,服务名,集群数目1,实例数1,等等
创建member-service-nacos-provider-10006并注册到NacosServer8848
它就可以参考member-service-nacos-provider-10004的文件进行配置,更加简单,就不一一列出了。
创建member-service-nacos-provider-10006
修改本模块pom.xml
创建application.yml
port:10006
创建主启动类
通过rename重命名来修改类名,比较快捷。
为看到更好提示,修改Controller
输出提示改为 10006执行
测试
http://localhost:10006/member/get/1
可以在http://localhost:8848/nacos的页面下,服务管理/服务列表下看到,服务名,集群数目1,实例数2,等等。可以查看“详情”
服务方的已完成
创建Nacos的服务消费者
需求说明/图解
添加消费方,通过nacos调用服务方
创建member-service-nacos-consumer-80并注册到NacosServer8848,步骤:
创建member-service-nacos-consumer-80
修改pom.xml
参考member-service-consumer-80的pom.xml
看来spring-cloud-starter-alibaba-nacos-discovery之前老师确实是写错了的,看后文什么时候发现并更正吧。或者不会有影响
<dependencies>
<!--引入Alibaba Nacos-->
<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-web</artifactId>
</dependency>
<!--说明:starter-actuator是springboot程序的监控系统,可实现系统的健康检测
可以通过http://localhost:80/actuator看到相关的连接和信息-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!--相对于provider,删除了以下依赖
mybatis
druid
mysql
jdbc
test-->
<dependency>
<groupId>com.stein.springcloud</groupId>
<artifactId>e-commerce-center-common-api</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
创建resources/application.yml
server:
port: 80
spring:
application:
name: member-service-nacos-consumer-80
#配置nacos
cloud:
nacos:
discovery:
server-addr: localhost:8848 #nacos server的服务地址
创建主启动类java\com\stein\springcloud\MemberConsumerApplication.java
@SpringBootApplication
@EnableDiscoveryClient //启动引入的Nacos发现
public class MemberNacosConsumerApplication80 {
public static void main(String[] args) {
SpringApplication.run(MemberNacosConsumerApplication80.class,args);
}
}
业务类
RestTemplate用来做远程调用的/config
@Configuration
public class CustomizationBean {
//nacos本身就集成了Ribbon,直接支持Ribbon+RestTemplate调用
//说明:配置注入RestTemplate bean/对象
//这里的@LoadBalanced就是赋予RestTemplate负载均衡的能力
//默认是使用轮询算法来访问远程调用接口/地址
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
功能Controller
@Slf4j
@RestController
public class MemberNacosConsumerController {
@Resource
private RestTemplate restTemplate;
private static final String MEMBER_SERVICE_NACOS_PROVIDER_URL="http://member-service-nacos-provider";
//添加方法
@PostMapping("/member/nacos/consumer/add")
public Result<Member> addMember(Member member){
log.info("consumer-member={}",member);
return restTemplate.postForObject(MEMBER_SERVICE_NACOS_PROVIDER_URL + "/member/add", member, Result.class);
}
//查询方法
@GetMapping("/member/nacos/consumer/query/{id}")
public Result<Member> queryMemberById(@PathVariable Long id){
return restTemplate.getForObject(MEMBER_SERVICE_NACOS_PROVIDER_URL+"/member/query/"+id,
Result.class);
}
}
测试
运行nacos.cmd
运行member-service-nacos-provider-10006
运行member-service-nacos-provider-10004
运行member-service-nacos-consumer-80
浏览器查看:http://localhost:8848/nacos 服务管理/'服务列表,可以看到这3个服务名
浏览器访问:http://localhost/member/nacos/consumer/query/2 可以正常查询
配置自己的负载均衡算法(如随机算法),测试完毕恢复成原来的轮询算法
@Configuration
public class RibbonRule {
@Bean //一定要记得这个Bean,不然不会生效
public IRule myRibbonRule(){
return new RandomRule();
}
}
Nacos AP和CP切换
各种注册中心对比
选择AP还是CP?
1、CP:服务可以不能用,但必须要保证数据的一致性。
2、AP:数据可以短暂不一致,但最终是需要一致的,无论如何都要保证服务的可用。
3、取舍:只能在CP和AP选择一个平衡点,大多数都是选择AP模式
AP和CP切换
Nacos中AP和CP模式如何切换
Nacos配置中心实例
需求分析/图解
配置中心,个人理解,用于统一配置,统一管理等,方便,灵活。
在Nacos Server加入配置
1.进入到Nacos Server
2.加入配置,特别提醒:文件后缀.yaml别忘了,不能是.yml
配置管理/配置列表,点击“+”号,
创建Data ID:e-commerce-nacos-config-client-dev.yaml
配置格式:选择YAML
配置内容:需要注意缩进,以及冒号:后面的空格,值加“引号”
config:
ip: "192.168.222.222"
name: "stein"
创建Nacos配置客户端模块e-commerce-nacos-config-client5000
创建Module,名为:e-commerce-nacos-config-client5000
创建好后,检查自己的pom.xml和父项目的pom.xml,看看是否相互对应
修改pom.xml
参考member-service-nacos-consumer-80的denpendencies
添加配置中心依赖,其他和consumer-80一致
<!--加入nacos配置中心的依赖 版本依然是靠版本仲裁获得-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
刷新pom.xml
创建main/resources/application.yml
spring:
profiles:
active: dev #指定环境,常见的环境有dev开发/test测试/prod生户
创建bootstrap.yml
说明:在项目启动时,会先运行bootstrap.yml,再运行application.yml。两个文件可以配合使用
server:
port: 5000
spring:
application:
# 这里name需要参考nacos 配置中心的Data Id。
# 注意-dev是根据配置自动添加的。添加后,需要和Data Id一致
name: e-commerce-nacos-config-client
# 配置nacos
cloud:
nacos:
discovery:
server-addr: localhost:8848 #nacos服务注册中心地址
config:
server-addr: localhost:8848 #配置中心地址。分布式,可以是不一样的
file-extension: yaml #指定配置文件格式。也参与了Data Id的名称拼接,后缀名.yaml
主启动类
路径java\com\stein\springcloud\NacosConfigClientApplication5000.java
@SpringBootApplication
@EnableDiscoveryClient
public class NacosConfigClientApplication5000 {
public static void main(String[] args) {
SpringApplication.run(NacosConfigClientApplication5000.class,args);
}
}
业务类
创建controller/NacosConfigClientController.java
@RestController
@RefreshScope
@Slf4j
public class NacosConfigClientController {
// 1.client会拉取nacos server的e-commerce--nacos-config-client-dev.yaml
// 的config。
@Value("${config.ip}")
private String configIp;
@Value("${config.name}")
private String configName;
@GetMapping("/nacos/config/ip")
public String getConfigIp(){
return configIp;
}
@GetMapping("/nacos/config/name")
public String getConfigName(){
return configName;
}
}
测试
运行nacos
运行NacosConfigClientApplication5000.java
浏览器访问:http://localhost:5000/nacos/config/ip 或者 http://localhost:5000/nacos/config/name 可以看到对应的config内容
踩坑注意:端口6000等有一系列禁用的端口,更换不使用即可。
注意事项和细节
src\main\java\com\hspedu\springcloud\controller\NacosConfigClientController.java@Value(“${config.ip}”),
import org.springframework.beans.factory.annotation.Value;而不是lombok包下的。
1.配置文件application.yml和bootstrap.yml结合会得到配置文件/资源的地址
2.参考文档:https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html
3.注意在Nacos Server的配置文件的后缀是.yaml,而不是.yml
4.在项目初始化时,要保证先从配置中心进行配置拉取,拉取配置之后,才能保证项目的正常启动,也
就是说如果项目不能正确的获取到Nacos Server的配置数据,项目是启动不了的。
5.springboot中配置文件的加载是存在优先级顺序的,bootstrap.yml优先级高于application.yml
6.@RefreshScope是springcloud原生注解,实现配置信息自动刷新,如果在Nacos Server修改了配置数
据,Client端就会得到最新配置
标题Nacos分类配置(实现配置隔离)
DatalD方案
需求分析
环境不同,引入方式不同。
配置实现
启动nacos
浏览器访问:http://localhost:8848/nacos,管理配置/配置列表,:“+”号添加
DataID:名称+方式+后缀的命名方式
配置格式:YAML
config:
ip: “192.168.3.3[test测试]”
name: “试试就测试”
修改application.yml
spring:
profiles:
active: test #/这儿改成了test
测试
浏览器访问:
http://localhost:5000/nacos/config/name
http://localhost:5000/nacos/config/ip
查看对应结果
Group:方案
需求分析
在一个分布式项目中,有不同的开发小组,需要到Nacos Server获取对应的开发环境配置的数据。实现小组之间的配置隔离。
其余配置参考DataID方案。
配置实现
分组group重新建立一个,不使用原有default_group 即可。
修改application.yml
修改bootstrap.yml
spring:
cloud:
config:
group: order #添加该属性,选择哪个分组,默认是default_group
测试
Namespace方案
需求分析
比如不同的公司进入来开发不同的模块。
配置实现
nacos网页,命名空间,新建命名空间,命名空间名,和描述,ID自动生成
然后在不同命名空间,创建自己的独立配置
修改application.yml
修改bootstrap.yml
spring:
cloud:
config:
group: order #添加该属性,选择哪个分组,默认是default_group
namespace: d381703c-26da-43c3-ae5e-d49cd2b5e63b #这儿填写namespaceID
测试
Namespace/Group/Data ID关系梳理
- 他们的关系如图:
- 梳理
·Nacos默认的命名空间是public,Namespace主要用来实现配置隔离,隔离范围大
·Group默认是DEFAULT_GROUP,Group可以把不同的微服务划分到同一个分组里面去
·Service就是微服务,相同的Service可以是一个Cluster(簇/集群),Instance就是微服务的实例