浅学微服务Nacos

  1. 目录

    1.windows安装Nacos

    1.1.下载安装包

    1.2解压到任意非中文目录下:

    1.3启动

     2.图解nacos

     3.服务注册

     3.5nacos集群

     3.6权重配置

     3.8临时实例

    3.9Nacos配置中心


    1.windows安装Nacos

1.1.下载安装包

在Nacos的GitHub页面,提供有下载链接,可以下载编译好的Nacos服务端或者源代码:

GitHub主页:https://github.com/alibaba/nacos

GitHub的Release下载页:https://github.com/alibaba/nacos/releases

​​​​​​本文使用nacos-server-1.4.1.zip版本

1.2解压到任意非中文目录下

目录说明:

  • bin:启动脚本

  • conf:配置文件

Nacos的默认端口是8848,如果你电脑上的其它进程占用了8848端口,请先尝试关闭该进程。

如果无法关闭占用8848端口的进程,也可以进入nacos的conf目录,修改配置文件中的端口:

 修改其端口号:server.port=XXXX(任意不冲突的端口)

1.3启动

在bin目录打开cmd

执行Windows命令:

startup.cmd -m standalone

 2.图解nacos

 3.服务注册

3.1父工程添加依赖

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-dependencies</artifactId>
    <version>2.2.6.RELEASE</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>

 3.2每个服务添加依赖

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

3.3每个服务添加nacos配置

spring:
  cloud:
    nacos:
      server-addr: 127.0.0.1:8848

3.4将服务跑起来,看nacos控制页面有没服务。

 3.5nacos集群

NacosRule:

Ribbon的默认实现 ZoneAvoidanceRule 并不能实现根据同集群优先来实现负载均衡,我们把规则改成 NacosRule 即可。我们是用 orderservice 调用 userservice,所以在 orderservice 配置规则。

@Bean
public IRule iRule(){
    //默认为轮询规则,这里自定义为随机规则
    return new NacosRule();
}

或者在对应的服务yml中配置效果一样的

userservice:
  ribbon:
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule #负载均衡规则 

微服务互相访问时,应该尽可能访问同集群实例,因为本地访问速度更快。当本集群内不可用时,才访问其它集群。

微服务配置

 本地多开模拟集群

-Dserver.port=8083 -Dspring.cloud.nacos.discovery.cluster-name=SH

 本地配置的是orderServer 8082和userServer 8081 8084是在HZ 8083在SH 

通过http://localhost:8082/order/108 访问8081和8084有日志输出,8083没有,说明实现了区域集群管理。

当8081,8084服务挂掉,通过http://localhost:8082/order/108 看到8083有日志输出,且页面没有出错,说明当没有相同区域的服务可用时会跨区域使用。

 order服务会抛出异常:

 3.6权重配置

服务器设备性能有差异,部分实例所在机器性能较好,另一些较差,我们希望性能好的机器承担更多的用户请求。但默认情况下 NacosRule 是同集群内随机挑选,不会考虑机器的性能问题。

因此,Nacos 提供了权重配置来控制访问频率,0~1 之间,权重越大则访问频率越高,权重修改为 0,则该实例永远不会被访问。

在 Nacos 控制台,找到 user-service 的实例列表,点击编辑,即可修改权重。

 3.7环境隔离

  • Nacos 中可以有多个 namespace
  • namespace 下可以有 group、service 等
  • 不同 namespace 之间相互隔离,例如不同 namespace 的服务互相不可见。

 public和dev是两个namespace,相互是隔离不可见的

 将orderServer yaml中配置,重启

 

 3.8临时实例

Nacos 的服务实例分为两种类型:

  • 临时实例:如果实例宕机超过一定时间,会从服务列表剔除,默认的类型
  • 非临时实例:如果实例宕机,不会从服务列表剔除,也可以叫永久实例
spring:
  cloud:
    nacos:
      discovery:
        ephemeral: false # 设置为非临时实例

 设置好后重新启动orderServer,后关闭orderserver

 nacos会等待,不会直接删除服务,orderserver恢复后会自动注册上来。

3.9Nacos配置中心

3.9.1Nacos除了可以做注册中心,同样可以做配置管理来使用。

当微服务部署的实例越来越多,达到数十、数百时,逐个修改微服务配置就会让人抓狂,而且很容易出错。我们需要一种统一配置管理方案,可以集中管理所有实例的配置。

 Nacos 一方面可以将配置集中管理,另一方可以在配置变更时,及时通知微服务,实现配置的热更新。

 项目的核心配置,需要热更新的配置才有放到 nacos 管理的必要。基本不会变更的一些配置(例如数据库连接)还是保存在微服务本地比较好。

在nacos 之前的springboot启动加载配置文件的过程是:

 加入 Nacos 配置,它的读取是在 application.yml 之前的:

如果把 nacos 地址放在 application.yml 中,显然是不合适的,Nacos 就无法根据地址去获取配置了。因此,nacos 地址必须放在优先级最高的 bootstrap.yml 文件。

因为我部署的nacos热配置在userserver中,所以要在uerserver的pom文件中添加依赖:

<!--nacos配置管理依赖-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>

然后,在 user-service  resources中添加一个 bootstrap.yml 文件,内容如下:

spring:
  application:
    name: userservice # 服务名称
  profiles:
    active: dev #开发环境,这里是dev 
  cloud:
    nacos:
      server-addr: localhost:8848 # Nacos地址
      config:
        file-extension: yaml # 文件后缀名

在 user-service 中的 UserController 中添加业务逻辑,读取 pattern.dateformat 配置并使用:

@Value("${pattern.dateformat}")
private String dateformat;

@GetMapping("now")
public String now(){
    //格式化时间
    return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat));
}

 方式一:在 @Value 注入的变量所在类上添加注解 @RefreshScope

 方式二:使用 @ConfigurationProperties 注解读取配置文件,就不需要加 @RefreshScope 注解。

 3.9.2配置共享

其实在服务启动时,nacos 会读取多个配置文件,例如:

  • [spring.application.name]-[spring.profiles.active].yaml,例如:userservice-dev.yaml
  • [spring.application.name].yaml,例如:userservice.yaml

这里的 [spring.application.name].yaml 不包含环境,因此可以被多个环境共享

添加一个环境共享配置:

 java代码中添加:

 访问结果:

 加载文件不同就不能获取userservice-dev.yaml里的配置,只能获取共享的配置

 结果:

不管是 dev,还是 test 环境,都读取到了 envSharedValue 这个属性的值。

上面的都是同一个微服务下,那么不同微服务之间可以环境共享吗?

答案是肯定的。 

通过下面的两种方式来指定:

  • extension-configs
  • spring: 
      cloud:
        nacos:
          config:
            file-extension: yaml # 文件后缀名
            extends-configs: # 多微服务间共享的配置列表
              - dataId: common.yaml # 要共享的配置文件id
  • shared-configs
  • spring: 
      cloud:
        nacos:
          config:
            file-extension: yaml # 文件后缀名
            shared-configs: # 多微服务间共享的配置列表
              - dataId: common.yaml # 要共享的配置文件id

    3.9.3配置优先级

  • 当 nacos、服务本地同时出现相同属性时,优先级有高低之分。

  •  多种配置的优先级:

  • 详细学习请看nacos官方文档:

  • 什么是 Nacos

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值