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

cnblogs 2024-07-31 15:09:00 阅读 59

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

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

    <li>Nacos 有两大功能: 注册中心[替代Eureka]+配置中心[替代Config]
  1. 架构理论基础: CAP 理论(支持AP【高可用、分区容错性】 和CP【分区容错性和数据一致性】, 可以切换)

Nacos 结构图

Nacos 作为 服务注册中心

服务提供者代码实现
    <li>

    引入依赖

    <code><dependency>

    <!--引入 nacos 场景启动器starter-->

    <groupId>com.alibaba.cloud</groupId>

    <artifactId>spring-cloud-alibaba-nacos-discovery</artifactId>

    </dependency>

  1. 编辑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: '*'

  2. 创建主启动类

    @EnableDiscoveryClient //启用 nacos 服务发现

    @SpringBootApplication

    public class MemberNacosProviderApplication10004 {

    public static void main(String[] args) {

    SpringApplication.run(MemberNacosProviderApplication10004.class, args);

    }

    }

服务消费者代码实现
  1. 引入依赖

    <dependency>

    <!--引入 nacos 场景启动器starter-->

    <groupId>com.alibaba.cloud</groupId>

    <artifactId>spring-cloud-alibaba-nacos-discovery</artifactId>

    </dependency>

  2. 编辑application.yml文件

    server:

    port: 80

    spring:

    application:

    name: member-service-nacos-consumer-80

    #配置nacos

    cloud:

    nacos:

    discovery:

    server-addr: localhost:8848 #nacos-server的地址

  3. 创建主启动类

    @SpringBootApplication

    @EnableDiscoveryClient //引入nacos服务发现

    public class MemberNacosConsumerApplication80 {

    public static void main(String[] args) {

    SpringApplication.run(MemberNacosConsumerApplication80.class, args);

    }

    }

  4. 编写配置类

    //配置注入 RestTemplate

    @Configuration

    public class CustomizationBean {

    @LoadBalanced //赋予 restTemplate 负载均衡 的能力

    @Bean

    public RestTemplate getRestTemplate() {

    return new RestTemplate();

    }

    }

  5. 编写 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<Member> save(Member member) {

    return restTemplate.postForObject(MEMBER_SERVICE_NACOS_PROVIDER_URL + "/member/save", member, Result.class);

    }

    //根据id 调用服务接口 返回member

    @GetMapping("/get/{id}")

    public Result<Member> 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的切换

【偏理论,实际开发中也不太会切换】

只需要记住:Nacos AP 和 CP 是可以切换的, 大多数都是选择AP 模式

选择AP 还是CP?

  1. CP: 服务可以不能用,但必须要保证数据的一致性。
  2. AP: 数据可以短暂不一致,但最终是需要一致的,无论如何都要保证服务的可用。
  3. 只能在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

配置中心代码实现
  1. 在 http://localhost:8848/nacos/ 新建配置

    li>
  2. 在微服务模块进行相关配置

    1.进入相关依赖

    <code><!--引入 配置中心 nacos-config 启动器 -->

    <dependency>

    <groupId>com.alibaba.cloud</groupId>

    <artifactId>spring-cloud-alibaba-nacos-config</artifactId>

    </dependency>

    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 配置隔离

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

  1. Data ID方案
  2. Group方案
  3. Namespace方案
Data ID方案

Data ID方案的使用场景:【按照Data ID 进行隔离】微服务模块可以切换获取到Nacos Server 的配置数据【包括开发环境dev、测试环境test】。 即:根据环境不同切换不同的配置数据

Data ID方案 的 实现

  1. 需要再增加一个配置数据

    li>
  2. 修改application.yml、

    <code>spring:

    profiles:

    active: test #指定环境 dev/test/prod

    li>
Group方案

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

Group方案 的 实现:

  1. 添加新的配置,并指定组名

    li>
  2. 修改bootstrap.yml

    <code>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方案

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

Namespace方案 的 实现:

  1. 新建命名空间

    li>
  2. 在创建好的命名空间下,创建新的配置

    li>
  3. 修改bootstrap.yml文件

    <code>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 #指定命名空间

Namespace/Group/Data ID方案 梳理

    <li>Nacos默认的命名空间是public,Namespace主要用来实现配置隔离, 隔离范围大
  1. Group默认是DEFAULT GROUP,Group可以把不同的微服务划分到同一个分组里面去


声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。