09.SpringCloud Alibaba Nacos
09.SpringCloud Alibaba Nacos
Nacos基础
下载地址:https://github.com/alibaba/nacos/releases/tag/1.2.1
创建Nacos服务提供者
需求说明/图解
创建 member-service-nacos-provider-10004并注册到NacosServer8848
修改本模块pom.xml
<?xml version=”1.0” encoding=”UTF-8”?>
e-commerce-center
com.hspedu.springcloud
1.0-SNAPSHOT
4.0.0
member-service-nacos-provider-10004
com.alibaba.cloud
spring-cloud-alibaba-nacos-discovery
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-actuator
org.mybatis.spring.boot
mybatis-spring-boot-starter
com.alibaba
druid-spring-boot-starter
1.1.17
mysql
mysql-connector-java
org.springframework.boot
spring-boot-starter-jdbc
org.projectlombok
lombok
org.springframework.boot
spring-boot-starter-test
com.hspedu.springcloud
e_commerce_center-common-api
${project.version}
8
8
拷贝member-service-provider-10000 的main目录文件
修改application.yml
server:
port: 10004spring:
application:name: member-service-nacos-provider #配置应用的名称
datasource:
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc
//localhost:3306/e_commerce_center_db?useSSL=true&useUnicode=true&characterEncoding=UTF-8
username: root
password: 123456
配置nacos
cloud:
nacos:
discovery:
server-addr: localhost:8848 #配置 Nacos Server的地址
配置暴露所有的监控点
management:
endpoints:web:
exposure:
include: '*'
mybatis:
mapper-locations: classpath:mapper/*.xml #指定mapper.xml文件位置
type-aliases-package: com.hspedu.springcloud.entity #实体类所在的包,这样通过类名可以引用创建主启动类
- @EnableDiscoveryClient 引入Nacos发现的注解
package com.hspedu.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;// @EnableDiscoveryClient 引入Nacos发现的注解
@EnableDiscoveryClient
@SpringBootApplication
public class MemberNacosProviderApplication10004 {
public static void main(String[] args) {
SpringApplication.run(MemberNacosProviderApplication10004.class,args);
}
}
为看到更好提示,修改Controller
package com.hspedu.springcloud.controller;
import com.hspedu.springcloud.entity.Member;
import com.hspedu.springcloud.entity.Result;
import com.hspedu.springcloud.service.MemberService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;import javax.annotation.Resource;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import java.util.concurrent.TimeUnit;@Slf4j
@RestController
public class MemberController {
// 装配MemberService
@Resource
private MemberService memberService;
// 查询接口
@GetMapping("member/get/{id}")
public Result getMemberById(@PathVariable("id") Long id, HttpServletRequest request) {
// String color = request.getParameter("color");
// String address = request.getParameter("address");
// 模拟超时,休眠5秒
// try {
// TimeUnit.MILLISECONDS.sleep(5000);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
Member member = memberService.queryMemberById(id);
if (member != null) {
return Result.success("查询会员成功 member-service-nacos-provider-10004", member);
} else {
return Result.error("402", "ID=" + id + "不存在");
}
}
//编写方法,完成添加
//老韩说明
//1. 我们的前端如果是以json格式来发送添加信息furn, 那么我们需要使用@RequestBody
// , 才能将数据封装到对应的bean, 同时保证http的请求头的 content-type是对应
//2. 如果前端是以表单形式提交了,则不需要使用@RequestBody, 才会进行对象参数封装, 同时保证
// http的请求头的 content-type是对应
//3. 一会老师给小伙伴测试
@PostMapping("member/save")
public Result save(@RequestBody Member member) {
log.info("service-provider member={}",member);
int affected = memberService.save(member);
if (affected > 0) {
return Result.success("添加会员成功 member-service-nacos-provider-10004", affected);
} else {
return Result.error("401", "添加会员失败");
}
}
}
测试
- 启动Nacos Server 8848
- 启动member-service-nacos-provider-10004
- 观察nacos服务是否注册成功
- 浏览器 http://localhost:10004/member/get/2
创建 member-service-nacos-provider-10006并注册到NacosServer8848
创建member-service-nacos-provider-10006
修改本模块pom.xml
<?xml version=”1.0” encoding=”UTF-8”?>
e-commerce-center
com.hspedu.springcloud
1.0-SNAPSHOT
4.0.0
member-service-nacos-provider-10006
com.alibaba.cloud
spring-cloud-alibaba-nacos-discovery
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-actuator
org.mybatis.spring.boot
mybatis-spring-boot-starter
com.alibaba
druid-spring-boot-starter
1.1.17
mysql
mysql-connector-java
org.springframework.boot
spring-boot-starter-jdbc
org.projectlombok
lombok
org.springframework.boot
spring-boot-starter-test
com.hspedu.springcloud
e_commerce_center-common-api
${project.version}
8
8
拷贝member-service-nacos-provider-10004 的main目录文件
修改application.yml
server:
port: 10006spring:
application:name: member-service-nacos-provider #配置应用的名称
datasource:
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc
//localhost:3306/e_commerce_center_db?useSSL=true&useUnicode=true&characterEncoding=UTF-8
username: root
password: 123456
配置nacos
cloud:
nacos:
discovery:
server-addr: localhost:8848 #配置 Nacos Server的地址
配置暴露所有的监控点
management:
endpoints:web:
exposure:
include: '*'
mybatis:
mapper-locations: classpath:mapper/*.xml #指定mapper.xml文件位置
type-aliases-package: com.hspedu.springcloud.entity #实体类所在的包,这样通过类名可以引用创建主启动类
package com.hspedu.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;// @EnableDiscoveryClient 引入Nacos发现的注解
@EnableDiscoveryClient
@SpringBootApplication
public class MemberNacosProviderApplication10006 {
public static void main(String[] args) {
SpringApplication.run(MemberNacosProviderApplication10006.class,args);
}
}
为看到更好提示,修改Controller
package com.hspedu.springcloud.controller;
import com.hspedu.springcloud.entity.Member;
import com.hspedu.springcloud.entity.Result;
import com.hspedu.springcloud.service.MemberService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;import javax.annotation.Resource;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import java.util.concurrent.TimeUnit;@Slf4j
@RestController
public class MemberController {
// 装配MemberService
@Resource
private MemberService memberService;
// 查询接口
@GetMapping("member/get/{id}")
public Result getMemberById(@PathVariable("id") Long id, HttpServletRequest request) {
// String color = request.getParameter("color");
// String address = request.getParameter("address");
// 模拟超时,休眠5秒
// try {
// TimeUnit.MILLISECONDS.sleep(5000);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
Member member = memberService.queryMemberById(id);
if (member != null) {
return Result.success("查询会员成功 member-service-nacos-provider-10006", member);
} else {
return Result.error("402", "ID=" + id + "不存在");
}
}
//编写方法,完成添加
//老韩说明
//1. 我们的前端如果是以json格式来发送添加信息furn, 那么我们需要使用@RequestBody
// , 才能将数据封装到对应的bean, 同时保证http的请求头的 content-type是对应
//2. 如果前端是以表单形式提交了,则不需要使用@RequestBody, 才会进行对象参数封装, 同时保证
// http的请求头的 content-type是对应
//3. 一会老师给小伙伴测试
@PostMapping("member/save")
public Result save(@RequestBody Member member) {
log.info("service-provider member={}",member);
int affected = memberService.save(member);
if (affected > 0) {
return Result.success("添加会员成功 member-service-nacos-provider-10006", affected);
} else {
return Result.error("401", "添加会员失败");
}
}
}
测试
- 启动Nacos Server 8848
- 启动member-service-nacos-provider-10006
- 观察nacos服务是否注册成功
- 浏览器 http://localhost:10006/member/get/2
创建Nacos服务消费者
需求说明/图解
创建member-service-nacos-consumer-80 并注册到NacosServer8848
创建member-service-nacos-consumer-80
修改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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>e-commerce-center</artifactId>
<groupId>com.hspedu.springcloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>member-service-nacos-consumer-80</artifactId>
<!-- 引入相关的依赖-->
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- 引入web-starter 我们指定版本仲裁(从父项目继承了版本)-->
<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>
<!-- lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- 引入e_commerce_center-common-api-->
<dependency>
<groupId>com.hspedu.springcloud</groupId>
<artifactId>e_commerce_center-common-api</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
</project>
创建application.yml
server:
port: 81spring:
application:name: member-service-nacos-consumer-80
配置nacos
cloud:
nacos:
discovery:
server-addr: localhost:8848 #nacos server的地址
创建主启动类
package com.hspedu.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;@SpringBootApplication
@EnableDiscoveryClient // 引入的是启动nacos发现注解
public class MemberNacosConsumerApplication80 {public static void main(String[] args) {
SpringApplication.run(MemberNacosConsumerApplication80.class,args);
}
}
业务类创建
创建 CustomizationBean类
package com.hspedu.springcloud.config;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
/**
* CustomizationBean:配置类
* 配置注入RestTemplate bean/对象
*/
@Configuration
public class CustomizationBean {
// 配置注入RestTemplate bean/对象
// 这里的@LoadBalanced 就是赋予RestTemplate 负载均衡的能力
// 默认是使用轮询算法来访问远程调用接口
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
创建 MemberNacosConsumerController类
package com.hspedu.springcloud.controller;
import com.hspedu.springcloud.entity.Member;
import com.hspedu.springcloud.entity.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
@RestController
@Slf4j
public class MemberNacosConsumerController {
//http://member-service-nacos-provider 就是注册到Nacos server 的服务名
public static final String MEMBER_SERVICE_NACOS_PROVIDER_URL =
"http://member-service-nacos-provider"; //后面这里地方会修改成提供服务模块的注册别名
// 装配RestTemplate
@Resource
private RestTemplate restTemplate;
// 方法/接口,根据id调用服务接口返回member对象
@GetMapping("member/nacos/consumer/get/{id}")
public Result getMemberById(@PathVariable("id") Long id) {
return restTemplate.getForObject(MEMBER_SERVICE_NACOS_PROVIDER_URL + "/member/get/"+id,Result.class);
}
// 方法/接口 添加member对象到数据库表
@PostMapping("member/nacos/consumer/save")
public Result<Member> save(Member member){
log.info("service-consumer member={}",member);
// 拼接url
// member:就是通过restTemplate 发出的post请求携带数据
//Result.class :返回对象类型
return restTemplate.postForObject(MEMBER_SERVICE_NACOS_PROVIDER_URL + "/member/save", member, Result.class);
}
}
浏览器:http://localhost:81/member/nacos/consumer/get/2
创建RibbonRule类
package com.hspedu.springcloud.config;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* 配置自己的负载均衡算法
*/
@Configuration
public class RibbonRule {
// 配置注入自己的负载均衡算法
@Bean
public IRule myRibbonRule(){
// 这里返回的是RandomRule,当然小伙伴也可以自己指定
return new RandomRule();
}
}
Nacos AP和CP切换
各注册中心对比
选择AP还是CP
AP和CP切换
说明
参考 https://www.jianshu.com/p/c56e22c222bb
Nacos 配置中心实例
需求分析/图解
在Nacos Server 加入配置
Data ID: e-commerce-nacos-config-client-dev.yaml
创建Nacos配置客户端模块 e-commerce-nacos-config-client5000
创建Module
修改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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>e-commerce-center</artifactId>
<groupId>com.hspedu.springcloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>e-commerce-nacos-config-client5000</artifactId>
<!-- 引入相关的依赖-->
<dependencies>
<!-- 加入 nacos-config stater 场景启动器-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- 引入 alibaba-nacos 使用版本仲裁-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- 引入web-starter 我们指定版本仲裁(从父项目继承了版本)-->
<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>
<!-- lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- 引入e_commerce_center-common-api-->
<dependency>
<groupId>com.hspedu.springcloud</groupId>
<artifactId>e_commerce_center-common-api</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
</project>
创建application.yml
spring:
profiles:
active: dev # 指定环境,常见的环境有 dev开发/test测试/prod生产
创建bootstrap.yml
server:
port: 5000 # 端口
spring:
application:
# 这里的name 需要参考nacos 配置中心的Data id
name: e-commerce-nacos-config-client
# 配置nacos
cloud:
nacos:
discovery:
server-addr: localhost:8848 #nacos 服务注册中心地址
config:
server-addr: localhost:8848 #nacos 服务配置中心地址
file-extension: yaml # 指定yaml格式的配置
# 解读
# 1.nacos 配置客户端/当前的微服务模块,会根据配置,找到配置中心的数据(配置)
# 2.nacos.server-addr:loocalhost:8848 可以找到配置中心
# 3.spring.application.name 对应的是 Dataid e-commerce-nacos-config-client
# 4.在application.yml: 配置 spring.profiles.active: dev
# 5.spring.cloud.nacos.config.file-extension 配置文件的扩展名 .yaml
# 6. 小结:根据配置 就是 到loocalhost:8848 下的 e-commerce-nacos-config-client-dev.yaml
# 获取配置信息/数据
# 7.规则就是:${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
# 来定位配置中心的 Data ID
主启动类
package com.hspedu.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class NacosConfigClientApplication5000 {
public static void main(String[] args) {
SpringApplication.run(NacosConfigClientApplication5000.class,args);
}
}
业务类
package com.hspedu.springcloud.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@Slf4j
public class NacosConfigClientController {
/**
* 1.client 会拉取nacos server 的 e-commerce-nacos-config-client-dev.yaml
* config:
* ip: "122.22.22.22"
* name: "jiang"
* 2.@Value("${config.ip}") 会将config.ip 赋给 configIp
* 3.这里${config.ip}不能乱写,要有依据
*/
@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 Server
启动 e-commerce-nacos-config-client5000
浏览器 http://localhost:5000/nacos/config/ip
注意事项和细节
@RefreshScope 是springcloud原生注解,实现配置信息自动刷新
Nacos分类配置
DataID方案
需求分析/图解
解决方案分析
使用Data ID方案解决
配置实现
修改application.yml 把active修改成test
spring:
profiles:
active: test # 指定环境,常见的环境有 dev开发/test测试/prod生产
测试
http://localhost:5000/nacos/config/ip
Group方案
需求分析/图解
解决方案分析
使用Group方案解决
配置实现
配置 订单订单开发微服务模块的 yaml
配置 秒杀微服务模块的 yaml
修改application.yml active改成dev
spring:
profiles:
active: dev # 指定环境,常见的环境有 dev开发/test测试/prod生产
修改bootstrap.yml
添加上 spring.cloud.nacos.config.group: order 指定分组
server:
port: 5000 # 端口
spring:
application:
# 这里的name 需要参考nacos 配置中心的Data id
name: e-commerce-nacos-config-client
# 配置nacos
cloud:
nacos:
discovery:
server-addr: localhost:8848 #nacos 服务注册中心地址
config:
server-addr: localhost:8848 #nacos 服务配置中心地址
file-extension: yaml # 指定yaml格式的配置
group: order # 指定order组的配置,默认是DEFAULT_GROUP
测试
http://localhost:5000/nacos/config/ip
Namespace方案
需求分析/图解
解决方案分析
使用Namespace方案
配置实现
添加百度公司的Namespace
添加阿里公司的Namespace
在阿里的Namespance下添加配置
在百度的Namespance下添加配置
修改application.yml
spring:
profiles:
active: dev # 指定环境,常见的环境有 dev开发/test测试/prod生产
修改bootstrap.yml
添加上 spring.cloud.nacos.config.namespace 指定对应的namespace
spring:
application:
# 这里的name 需要参考nacos 配置中心的Data id
name: e-commerce-nacos-config-client
# 配置nacos
cloud:
nacos:
discovery:
server-addr: localhost:8848 #nacos 服务注册中心地址
config:
server-addr: localhost:8848 #nacos 服务配置中心地址
file-extension: yaml # 指定yaml格式的配置
group: seckill # 指定order组的配置,默认是DEFAULT_GROUP
namespace: 0334af75-332c-4bf0-b9a4-968827fc81e3 # 指定对应的namespace id[阿里]
测试
http://localhost:5000/nacos/config/ip
还没有评论,来说两句吧...