
引入依赖
com.alibaba.cloud
spring-cloud-alibaba-nacos-discovery
编辑application.yml文件
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: zy
#配置nacos
cloud:
nacos:
discovery:
server-addr: localhost:8848 #配置nacos-server的地址
#暴露监控点
management:
endpoints:
web:
exposure:
include: '*'
创建主启动类
@EnableDiscoveryClient //启用 nacos 服务发现
@SpringBootApplication
public class MemberNacosProviderApplication10004 {
public static void main(String[] args) {
SpringApplication.run(MemberNacosProviderApplication10004.class, args);
}
}
引入依赖
com.alibaba.cloud
spring-cloud-alibaba-nacos-discovery
编辑application.yml文件
server:
port: 80
spring:
application:
name: member-service-nacos-consumer-80
#配置nacos
cloud:
nacos:
discovery:
server-addr: localhost:8848 #nacos-server的地址
创建主启动类
@SpringBootApplication
@EnableDiscoveryClient //引入nacos服务发现
public class MemberNacosConsumerApplication80 {
public static void main(String[] args) {
SpringApplication.run(MemberNacosConsumerApplication80.class, args);
}
}
编写配置类
//配置注入 RestTemplate
@Configuration
public class CustomizationBean {
@LoadBalanced //赋予 restTemplate 负载均衡 的能力
@Bean
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}
编写 Controller
@EnableDiscoveryClient //启用服务发现
@RestController
@RequestMapping("/member/nacos/consumer")
@Slf4j
public class MemberNacosConsumerController {
//定义MEMBER_SERVICE_PROVIDER_URL 基础url地址
//member-service-nacos-provider 表示服务提供方【集群】,注册到nacos-server的服务名【小写】
//就是服务提供方【集群】,对外暴露的名称 member-service-nacos-provider
public static final String MEMBER_SERVICE_NACOS_PROVIDER_URL = "http://member-service-nacos-provider";
@Autowired
private RestTemplate restTemplate;
//接口
/***
* 添加member;
* member :通过restTemplate 发出的请求携带的数据;
* Result.class :返回对象的类型;
*/
@PostMapping("/save")
public Result save(Member member) {
return restTemplate.postForObject(MEMBER_SERVICE_NACOS_PROVIDER_URL + "/member/save", member, Result.class);
}
//根据id 调用服务接口 返回member
@GetMapping("/get/{id}")
public Result getMemberById(@PathVariable("id") Long id) {
return restTemplate.getForObject(MEMBER_SERVICE_NACOS_PROVIDER_URL + "/member/get/" + id, Result.class);
}
}
//配置自己的负载均衡算法
@Configuration
public class RibbonRule {
// 配置注入负载均衡算法
@Bean
public IRule myRibbonRule(){
return new RandomRule();//new 的就是负载均衡算法 ,自己选择,这里是随机算法
}
}
【偏理论,实际开发中也不太会切换】
只需要记住:Nacos AP 和 CP 是可以切换的, 大多数都是选择AP 模式
选择AP 还是CP?
Nacos 集群默认支持的是CAP原则中的AP原则,但是也可切换为CP原则(一般不切换)
CURL切换命令: curl -X PUT
'$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'
URL指令:
$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP
由于采用本地静态配置无法保持是实性等问题,我们需要有服务配置中心
参考文档: https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html
在 http://localhost:8848/nacos/ 新建配置

在微服务模块进行相关配置
1.进入相关依赖
com.alibaba.cloud
spring-cloud-alibaba-nacos-config
2.配置application.yml
spring:
profiles:
active: dev #指定环境 dev/test/prod
3.配置bootstrap.yml
springboot 中配置文件的加载是存在优先级顺序的, bootstrap.yml 优先级高于application.yml
server:
port: 5000
spring:
application:
#需要参考 nacos配置中心的Data Id
name: e-commerce-nacos-config-client
#配置Nacos
cloud:
nacos:
discovery:
server-addr: localhost:8848 #服务注册中心地址
config:
server-addr: localhost:8848 #服务配置中心地址
file-extension: yaml #指定 yaml格式的配置
Nacos 微服务模块会根据配置,找到配置中心的配置文件,会将 name: e-commerce-nacos-config-client 和 active: dev 和 file- extension: yaml 进行拼接,最终会找到Data Id 为e-commerce-nacos-config-client-dev.yaml 的配置文件进行拉取。
即 : ${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}
4.编写主启动类
@SpringBootApplication
@EnableDiscoveryClient
public class NacosConfigClientApplication5000 {
public static void main(String[] args) {
SpringApplication.run(NacosConfigClientApplication5000.class, args);
}
}
5.编写Controller
@RestController
@Slf4j
public class NacosConfigClientController {
//client 会拉取对应的Data Id的信息
/* config:
ip: "122.22.22.22"
name: "zy"
*/
@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;
}
}
@RefreshScope 是springcloud 原生注解,实现配置信息自动刷新, 如果在Nacos Server 修改了配置数据,Client 端就会得到最新配置
@RestController
@Slf4j
@RefreshScope //实现配置信息自动刷新
public class NacosConfigClientController {
@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 实现配置隔离有多种方案:
Data ID方案的使用场景:【按照Data ID 进行隔离】微服务模块可以切换获取到Nacos Server 的配置数据【包括开发环境dev、测试环境test】。 即:根据环境不同切换不同的配置数据
Data ID方案 的 实现
需要再增加一个配置数据

修改application.yml 、
spring:
profiles:
active: test #指定环境 dev/test/prod
Group方案的使用场景:【按照组来隔离】在一个分布式项目中,有不同的开发小组,需要到Nacos Server获取自己对应的开发环境配置的数据
Group方案 的 实现:
添加新的配置,并指定组名

修改bootstrap.yml
server:
port: 5000
spring:
application:
name: e-commerce-nacos-config-client
#配置Nacos
cloud:
nacos:
discovery:
server-addr: localhost:8848
config:
server-addr: localhost:8848
file-extension: yaml
group: group1 #指定组
Namespace 方案的使用场景:【按照组织和公司来隔离】在一个分布式项目中,有多个组织/公司 的开发组参与,需要到 Nacos Server 获取开发环境/其他环境 的配置信息
Namespace方案 的 实现:
新建命名空间

在创建好的命名空间下,创建新的配置

修改bootstrap.yml文件
server:
port: 5000
spring:
application:
name: e-commerce-nacos-config-client
cloud:
nacos:
discovery:
server-addr: localhost:8848
config:
server-addr: localhost:8848
file-extension: yaml
group: seckill #指定组
namespace: 36827fcf-3e1c-4c3c-a778-e95941260d2a #指定命名空间

登录查看全部
参与评论
手机查看
返回顶部