关于java:Nacos服务注册与发现的2种实现方法

3次阅读

共计 4693 个字符,预计需要花费 12 分钟才能阅读完成。

Spring Cloud Alibaba 技术体系中的 Nacos,提供了两个重要的性能:注册核心(服务注册与发现)性能和配置核心性能。

其中注册核心解决了微服务调用中,服务提供者和服务调用者的解耦,让程序开发者能够无需过多的关注服务提供者和调用者的运行细节,只须要通过 Nacos 的注册核心就能够实现两者的互联互通,相当于实现了近程服务本地化,并且提供了健康检查等机制。

而 Nacos 注册核心又提供了两种服务注册和发现的办法:OpenAPI 办法和(Nacos)SDK 办法。

所谓的 OpenAPI 是指通过 Nacos 提供的凋谢 API 地址实现服务的注册与发现;而 SDK 办法是通过 Nacos 提供的 SDK 框架,也就是应用 spring-cloud-starter-alibaba-nacos-discovery 框架来实现服务注册与发现的性能。

1. 服务注册

1.1 服务注册:OpenAPI 模式

OpenAPI 的应用形式相对来说比较简单,首先关上零碎的命令行,在系统命令行中应用以下命令实现服务注册:

curl -X POST ‘http://127.0.0.1:8848/nacos/v…’

以上命令的执行后果如下图所示:

当返回“ok”后果时,示意服务注册胜利,其中:

  • serviceName:示意服务名。
  • ip:示意客户端程序的 IP 地址。
  • port:示意客户端程序的端口号。

与此同时咱们关上 Nacos 治理后盾也能够看到咱们注册的服务,如下图所示:

点击服务详情,能够看到咱们注册的 IP 地址和端口,如下图所示:

1.2 服务注册:SDK 模式

SDK 模式须要先创立一个 Spring Cloud 我的项目,我的项目创立办法请参考:https://mp.weixin.qq.com/s/c4…,我的项目创立胜利之后增加 Nacos 的 SDK 框架反对,最初再配置 Nacos 的相干信息即可,具体实现如下。

1.2.1 增加 SDK

在 pom.xml 中增加 Nacos SDK 框架反对,具体配置如下:

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

1.2.2 Nacos 配置

SDK 框架增加实现之后,须要在我的项目的配置文件中增加相应的配置,具体配置内容如下:

# 利用名称
spring.application.name=spring-cloud-nacos-producer
# Nacos 认证信息
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
# Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
# 注册到 nacos 的指定 namespace,默认为 public
spring.cloud.nacos.discovery.namespace=public

设置完以上配置之后,启动以后我的项目,程序会本人主动注册到 Nacos 服务端。

2. 服务发现

服务被正确注册到 Nacos 之后,就能够通过服务发现失常的调用服务提供者裸露的办法了,它的实现办法仍然有以下两种。

2.1 服务发现:OpenAPI 模式

在系统命令行中应用以下命令实现服务发现:

curl -X GET ‘http://127.0.0.1:8848/nacos/v…’

执行后果如下所示:

以上内容 JSON 格式化之后的信息如下:

{
  "name": "DEFAULT_GROUP@@spring-cloud-nacos-producer",
  "groupName": "DEFAULT_GROUP",
  "clusters": "","cacheMillis": 10000,"hosts": [
    {
      "instanceId": "192.168.76.224#8081#DEFAULT#DEFAULT_GROUP@@spring-cloud-nacos-producer",
      "ip": "192.168.76.224",
      "port": 8081,
      "weight": 1,
      "healthy": true,
      "enabled": true,
      "ephemeral": true,
      "clusterName": "DEFAULT",
      "serviceName": "DEFAULT_GROUP@@spring-cloud-nacos-producer",
      "metadata": {"preserved.register.source": "SPRING_CLOUD"},
      "instanceHeartBeatInterval": 5000,
      "instanceHeartBeatTimeOut": 15000,
      "ipDeleteTimeout": 30000
    }
  ],
  "lastRefTime": 1644210068852,
  "checksum": "","allIPs": false,"reachProtectionThreshold": false,"valid": true
}

其中:

  • healthy:示意是否开启衰弱检测性能,也就是定期的将本人的衰弱状态报告给 Nacos 服务器端。
  • ephemeral:示意是否为长期实例,长期实例下线一段时间之后,会被 Nacos 间接剔除。
  • “”instanceHeartBeatInterval”: 5000”:示意每 5s 执行一次衰弱检测。
  • “”instanceHeartBeatTimeOut”: 15000”:示意如果超过 15s 没有收到(客户端)心跳包,就将此实例设置为非衰弱状态。
  • “”ipDeleteTimeout”: 30000”:示意如果超过 30s 没有收到心跳包就剔除长期实例。

    2.2 服务发现:SDK 模式

    与 SDK 实现服务注册的步骤相似,服务发现也是先要创立 Spring Cloud 我的项目,而后增加 Nacos SDK 框架,再配置 Nacos 相干信息,最初编写代码来调用服务提供者提供的办法。

    2.2.1 增加 SDK

    在我的项目的 pom.xml 文件中,增加 Nacos SDK 框架反对,具体内容如下:

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

    2.2.2 配置 Nacos

    在我的项目的配置文件中增加如下 Nacos 的相干配置:

    # 利用名称
    spring.application.name=springcloud-nacos-consumer
    # Nacos 认证信息
    spring.cloud.nacos.discovery.username=nacos
    spring.cloud.nacos.discovery.password=nacos
    # Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口
    spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
    # 注册到 nacos 的指定 namespace,默认为 public
    spring.cloud.nacos.discovery.namespace=public

    2.2.3 调用服务提供者

    最初一步在我的项目中应用 RestTemplate 对象,实现调用服务提供者裸露的办法。
    首先咱们须要一个 RestTemplate 对象,具体实现代码如下:

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    import org.springframework.cloud.client.loadbalancer.LoadBalanced;
    import org.springframework.context.annotation.Bean;
    import org.springframework.web.client.RestTemplate;
    
    @SpringBootApplication
    @EnableDiscoveryClient
    public class SpringcloudNacosConsumerApplication {public static void main(String[] args) {SpringApplication.run(SpringcloudNacosConsumerApplication.class, args);
      }
      @LoadBalanced
      @Bean
      public RestTemplate restTemplate() {return new RestTemplate();
      }
    }

    有了 RestTemplate 对象之后,咱们就能够调用服务提供者了,调用代码如下:

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.client.RestTemplate;
    
    @RestController
    public class TestController {
      @Autowired
      private RestTemplate restTemplate;
      @RequestMapping("/hi")
      public String hi(String name) {
          // 调用服务提供者的 sayhi 办法,并将后果返回
          return restTemplate.getForObject("http://spring-cloud-nacos-producer/sayhi/" + 
                                           name,String.class);
      }
    }

    其中“http://spring-cloud-nacos-pro…”中的“spring-cloud-nacos-producer”为 Nacos 的服务名,“/sayhi/xxx”为服务提供者提供的办法拜访地址。从这里能够看出,在服务调用者这里无需晓得服务提供者的具体地址,只须要调用 Nacos 提供的服务名就能够了,这样就实现了服务提供者和调用者的(申请地址)解耦了。

    小结

    Nacos 注册核心提供了两种服务注册与发现的办法:OpenAPI 形式和 SDK 形式,其中比拟罕用的是 SDK 的实现形式,也就是在我的项目中增加 Nacos 的 SDK,再配置好 Nacos 的相干配置就能够实现服务的主动注册和调用了。

是非审之于己,毁誉听之于人,得失安之于数。

公众号:Java 中文社群

Java 面试合集:https://gitee.com/mydb/interview

正文完
 0