服务注册中心+设置中心-Nacos-微服务核心组件【分布式微服务笔记07】 ...

打印 上一主题 下一主题

主题 866|帖子 866|积分 2598

服务注册中心+设置中心-Nacos-微服务核心组件【分布式微服务笔记07】

服务注册中心+设置中心-Nacos


  • Nacos 有两大功能: 注册中心[替代Eureka]+设置中心[替代Config]
  • 架构理论根本: CAP 理论(支持AP【高可用、分区容错性】 和CP【分区容错性和数据同等性】, 可以切换)
Nacos 结构图


Nacos 作为 服务注册中心

服务提供者代码实现


  • 引入依靠
    1. <dependency>
    2.    
    3.     <groupId>com.alibaba.cloud</groupId>
    4.     <artifactId>spring-cloud-alibaba-nacos-discovery</artifactId>
    5. </dependency>
    复制代码
  • 编辑application.yml文件
    1. server:
    2.   port: 10004
    3. spring:
    4.   application:
    5.     name: member-service-nacos-provider #配置应用的名称
    6.   datasource:
    7.     type: com.alibaba.druid.pool.DruidDataSource
    8.     url: jdbc:mysql://localhost:3306/e_commerce_center_db?useSSL=true&useUnicode=true&characterEncoding=UTF-8
    9.     username: root
    10.     password: zy
    11.   #配置nacos
    12.   cloud:
    13.     nacos:
    14.       discovery:
    15.         server-addr: localhost:8848 #配置nacos-server的地址
    16. #暴露监控点
    17. management:
    18.   endpoints:
    19.     web:
    20.       exposure:
    21.         include: '*'
    复制代码
  • 创建主启动类
    1. @EnableDiscoveryClient //启用 nacos 服务发现
    2. @SpringBootApplication
    3. public class MemberNacosProviderApplication10004 {
    4.     public static void main(String[] args) {
    5.         SpringApplication.run(MemberNacosProviderApplication10004.class, args);
    6.     }
    7. }
    复制代码
服务消费者代码实现


  • 引入依靠
    1. <dependency>
    2.    
    3.     <groupId>com.alibaba.cloud</groupId>
    4.     <artifactId>spring-cloud-alibaba-nacos-discovery</artifactId>
    5. </dependency>
    复制代码
  • 编辑application.yml文件
    1. server:
    2.   port: 80
    3. spring:
    4.   application:
    5.     name: member-service-nacos-consumer-80
    6.   #配置nacos
    7.   cloud:
    8.     nacos:
    9.       discovery:
    10.         server-addr: localhost:8848 #nacos-server的地址
    复制代码
  • 创建主启动类
    1. @SpringBootApplication
    2. @EnableDiscoveryClient //引入nacos服务发现
    3. public class MemberNacosConsumerApplication80 {
    4.     public static void main(String[] args) {
    5.         SpringApplication.run(MemberNacosConsumerApplication80.class, args);
    6.     }
    7. }
    复制代码
  • 编写设置类
    1. //配置注入 RestTemplate
    2. @Configuration
    3. public class CustomizationBean {
    4.     @LoadBalanced //赋予 restTemplate 负载均衡 的能力
    5.     @Bean
    6.     public RestTemplate getRestTemplate() {
    7.         return new RestTemplate();
    8.     }
    9. }
    复制代码
  • 编写 Controller
    1. @EnableDiscoveryClient //启用服务发现
    2. @RestController
    3. @RequestMapping("/member/nacos/consumer")
    4. @Slf4j
    5. public class MemberNacosConsumerController {
    6.     //定义MEMBER_SERVICE_PROVIDER_URL 基础url地址
    7.     //member-service-nacos-provider 表示服务提供方【集群】,注册到nacos-server的服务名【小写】
    8.     //就是服务提供方【集群】,对外暴露的名称 member-service-nacos-provider
    9.     public static final String MEMBER_SERVICE_NACOS_PROVIDER_URL = "http://member-service-nacos-provider";
    10.     @Autowired
    11.     private RestTemplate restTemplate;
    12.     //接口
    13.     /***
    14.      *  添加member;
    15.      *  member :通过restTemplate 发出的请求携带的数据;
    16.      *  Result.class :返回对象的类型;
    17.      */
    18.     @PostMapping("/save")
    19.     public Result<Member> save(Member member) {
    20.         return restTemplate.postForObject(MEMBER_SERVICE_NACOS_PROVIDER_URL + "/member/save", member, Result.class);
    21.     }
    22.     //根据id 调用服务接口 返回member
    23.     @GetMapping("/get/{id}")
    24.     public Result<Member> getMemberById(@PathVariable("id") Long id) {
    25.         return restTemplate.getForObject(MEMBER_SERVICE_NACOS_PROVIDER_URL + "/member/get/" + id, Result.class);
    26.     }
    27. }
    复制代码
设置自己的负载平衡算法
  1. //配置自己的负载均衡算法
  2. @Configuration
  3. public class RibbonRule {
  4. //    配置注入负载均衡算法
  5.     @Bean
  6.     public IRule myRibbonRule(){
  7.         return new RandomRule();//new 的就是负载均衡算法 ,自己选择,这里是随机算法
  8.     }
  9. }
复制代码
Nacos AP 和 CP的切换

【偏理论,现实开发中也不太会切换】
只需要记住:Nacos AP 和 CP 是可以切换的, 大多数都是选择AP 模式
选择AP 还是CP?

  • CP: 服务可以不能用,但必须要包管数据的同等性。
  • AP: 数据可以短暂不同等,但终极是需要同等的,无论如何都要包管服务的可用。
  • 只能在CP 和AP 选择一个平衡点, 大多数都是选择AP 模式
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
Nacos 作为 服务设置中心

由于接纳本地静态设置无法保持是实性等题目,我们需要有服务设置中心
参考文档: https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html
设置中心代码实现


  • http://localhost:8848/nacos/ 新建设置

  • 在微服务模块进行相干设置
    1.进入相干依靠
    1. <dependency>
    2.     <groupId>com.alibaba.cloud</groupId>
    3.     <artifactId>spring-cloud-alibaba-nacos-config</artifactId>
    4. </dependency>
    复制代码
    2.设置application.yml
    1. spring:
    2.   profiles:
    3.     active: dev #指定环境  dev/test/prod
    复制代码
    3.设置bootstrap.yml
    springboot 中设置文件的加载是存在优先级顺序的, bootstrap.yml 优先级高于application.yml
    1. server:
    2.   port: 5000
    3. spring:
    4.   application:
    5.     #需要参考 nacos配置中心的Data Id
    6.     name: e-commerce-nacos-config-client
    7.   #配置Nacos
    8.   cloud:
    9.     nacos:
    10.       discovery:
    11.         server-addr: localhost:8848 #服务注册中心地址
    12.       config:
    13.         server-addr: localhost:8848 #服务配置中心地址
    14.         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.编写主启动类
    1. @SpringBootApplication
    2. @EnableDiscoveryClient
    3. public class NacosConfigClientApplication5000 {
    4.     public static void main(String[] args) {
    5.         SpringApplication.run(NacosConfigClientApplication5000.class, args);
    6.     }
    7. }
    复制代码
​        5.编写Controller
  1. @RestController
  2. @Slf4j
  3. public class NacosConfigClientController {
  4.     //client 会拉取对应的Data Id的信息
  5.      /*   config:
  6.             ip: "122.22.22.22"
  7.             name: "zy"
  8.      */
  9.     @Value("${config.ip}")
  10.     private String configIp;
  11.     @Value("${config.name}")
  12.     private String configName;
  13.    
  14.     @GetMapping("/nacos/config/ip")
  15.     public String getConfigIp(){
  16.         return configIp;
  17.     }
  18.     @GetMapping("/nacos/config/name")
  19.     public String getConfigName(){
  20.         return configName;
  21.     }
  22. }
复制代码
设置信息主动革新

@RefreshScope 是springcloud 原生注解,实现设置信息主动革新, 如果在Nacos Server 修改了设置数据,Client 端就会得到最新设置
  1. @RestController
  2. @Slf4j
  3. @RefreshScope //实现配置信息自动刷新
  4. public class NacosConfigClientController {
  5.     @Value("${config.ip}")
  6.     private String configIp;
  7.     @Value("${config.name}")
  8.     private String configName;
  9.     @GetMapping("/nacos/config/ip")
  10.     public String getConfigIp(){
  11.         return configIp;
  12.     }
  13.     @GetMapping("/nacos/config/name")
  14.     public String getConfigName(){
  15.         return configName;
  16.     }
  17. }
复制代码
Nacos 设置隔离

Nacos 实现设置隔离有多种方案:

  • Data ID方案
  • Group方案
  • Namespace方案
Data ID方案

Data ID方案的利用场景:【按照Data ID 进行隔离】微服务模块可以切换获取到Nacos Server 的设置数据【包罗开发环境dev、测试环境test】。 即:根据环境差异切换差异的设置数据
Data ID方案 的 实现

  • 需要再增加一个设置数据

  • 修改application.yml        、
    1. spring:
    2.   profiles:
    3.     active: test #指定环境  dev/test/prod
    复制代码
Group方案

Group方案的利用场景:【按照组来隔离】在一个分布式项目中,有差异的开发小组,需要到Nacos Server获取自己对应的开发环境设置的数据
Group方案 的 实现:

  • 添加新的设置,并指定组名

  • 修改bootstrap.yml
    1. server:
    2.   port: 5000
    3. spring:
    4.   application:
    5.     name: e-commerce-nacos-config-client
    6.    
    7.   #配置Nacos
    8.   cloud:
    9.     nacos:
    10.       discovery:
    11.         server-addr: localhost:8848
    12.       config:
    13.         server-addr: localhost:8848
    14.         file-extension: yaml
    15.         group: group1 #指定组
    复制代码
Namespace方案

Namespace 方案的利用场景:【按照组织和公司来隔离】在一个分布式项目中,有多个组织/公司 的开发组参与,需要到 Nacos Server 获取开发环境/其他环境 的设置信息
Namespace方案 的 实现:

  • 新建命名空间

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

  • 修改bootstrap.yml文件
    1. server:
    2.   port: 5000
    3. spring:
    4.   application:
    5.     name: e-commerce-nacos-config-client
    6.   cloud:
    7.     nacos:
    8.       discovery:
    9.         server-addr: localhost:8848
    10.       config:
    11.         server-addr: localhost:8848
    12.         file-extension: yaml
    13.         group: seckill #指定组
    14.         namespace: 36827fcf-3e1c-4c3c-a778-e95941260d2a #指定命名空间
    复制代码
Namespace/Group/Data ID方案 梳理



  • Nacos默认的命名空间是public,Namespace重要用来实现设置隔离, 隔离范围大
  • Group默认是DEFAULT GROUP,Group可以把差异的微服务划分到同一个分组里面去

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

曂沅仴駦

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表