浅学微服务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解压到任意非中文目录下

浅学微服务Nacos_第1张图片

目录说明:

  • bin:启动脚本

  • conf:配置文件

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

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

浅学微服务Nacos_第2张图片

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

1.3启动

在bin目录打开cmd

执行Windows命令:

startup.cmd -m standalone

浅学微服务Nacos_第3张图片

 2.图解nacos

浅学微服务Nacos_第4张图片

 3.服务注册

3.1父工程添加依赖


    com.alibaba.cloud
    spring-cloud-alibaba-dependencies
    2.2.6.RELEASE
    pom
    import

 3.2每个服务添加依赖


    com.alibaba.cloud
    spring-cloud-starter-alibaba-nacos-discovery

3.3每个服务添加nacos配置

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

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

浅学微服务Nacos_第5张图片

 3.5nacos集群

浅学微服务Nacos_第6张图片

NacosRule:

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

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

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

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

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

浅学微服务Nacos_第7张图片

微服务配置

浅学微服务Nacos_第8张图片

 本地多开模拟集群

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

浅学微服务Nacos_第9张图片

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

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

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

浅学微服务Nacos_第10张图片

 order服务会抛出异常:

 3.6权重配置

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

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

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

浅学微服务Nacos_第11张图片

 3.7环境隔离

  • Nacos 中可以有多个 namespace
  • namespace 下可以有 group、service 等
  • 不同 namespace 之间相互隔离,例如不同 namespace 的服务互相不可见。
  • 浅学微服务Nacos_第12张图片

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

浅学微服务Nacos_第13张图片

 将orderServer yaml中配置,重启

浅学微服务Nacos_第14张图片

 浅学微服务Nacos_第15张图片

 3.8临时实例

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

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

浅学微服务Nacos_第16张图片

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

浅学微服务Nacos_第17张图片

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

3.9Nacos配置中心

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

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

浅学微服务Nacos_第18张图片

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

浅学微服务Nacos_第19张图片

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

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

浅学微服务Nacos_第20张图片

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

浅学微服务Nacos_第21张图片

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

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


        
            com.alibaba.cloud
            spring-cloud-starter-alibaba-nacos-config
        

然后,在 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

浅学微服务Nacos_第22张图片

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

浅学微服务Nacos_第23张图片

 3.9.2配置共享

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

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

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

添加一个环境共享配置:

浅学微服务Nacos_第24张图片

 java代码中添加:

 访问结果:

浅学微服务Nacos_第25张图片

 加载文件不同就不能获取userservice-dev.yaml里的配置,只能获取共享的配置浅学微服务Nacos_第26张图片

 结果:

浅学微服务Nacos_第27张图片

不管是 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_第28张图片

     多种配置的优先级:

  • 浅学微服务Nacos_第29张图片

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

  • 什么是 Nacos

你可能感兴趣的:(微服务,java,架构)