摘要:原创地址:https://zijiancode.cn/archives/nacos-detail,欢迎转载,转载时请保留摘要,谢谢! 环境:Nacos 1.4.2

在前两篇:Nacos注册中心实战Nacos 配置中心实战阿鉴已经详细介绍了Nacos的两大功能,本篇就来补充一下之前未涉及到的小细节

OpenAPI

在讲注册中心内容时,我们已经知道Nacos本质上是一个服务,那么,是服务就会有接口,下面阿鉴给大家介绍一下注册实例接口

注册实例接口

接口:/nacos/v1/ns/instance

请求方式:POST

参数:

ip 字符串 服务实例IP
port int 服务实例port
namespaceId 字符串 命名空间ID
weight double 权重
enabled boolean 是否上线
healthy boolean 是否健康
metadata 字符串 扩展信息
clusterName 字符串 集群名
serviceName 字符串 服务名
groupName 字符串 分组名
ephemeral boolean 是否临时实例

测试:

  1. 发送一个curl请求,当然使用Postman也可以

    curl -i -X POST \
       -H "Content-Type:application/json" \
     'http://192.168.2.11:8850/nacos/v1/ns/instance?serviceName=test&ip=123.123.123.123&port=8081&username=nacos&password=nacos'
    
  2. 打开Nacos控制台查看效果

  3. 打开详情

    Nacos细节篇-LMLPHP

OpenAPI在服务中的关系

相信小伙伴已经发现了,我们在调用接口时传入的参数是什么,注册到Nacos上的实例信息就是什么,那么在实际项目中能不能也这样玩呢?

在之前我们使用Nacos时,我们使用的配置是这样:

server:
  port: 8080
spring:
  application:
    name: my-order
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.2.11:8850
        username: nacos
        password: nacos

现在我们将ipport加上

server:
  port: 8080
spring:
  application:
    name: my-order
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.2.11:8850
        ip: 123.123.123.123
        port: 1234
        username: nacos
        password: nacos

但实际上我本机ip地址为192.168.65.91

启动服务并在控制台查看服务详情

Nacos细节篇-LMLPHP

容器部署

在实际项目使用时,我们肯定倾向于让服务自己发现IP和端口号进行注册。

但是有一种情况让Nacos自己发现IP是不可行的。那就是使用容器部署服务。

  1. 比如我们在192.168.2.11的服务器上部署一个my-goods服务,此时Nacos自动发现的IP实际上是容器内部IP,如172.19.0.16

  2. 现在尝试使用在192.168.2.12的服务器上的my-order服务,对my-goods服务进行调用,此时会收到一个拒绝连接错误,因为调用的地址是172.19.0.16,但实际需要的地址是192.168.2.11

问题解决

简单的办法就是在配置文件中加上ip的配置,如

server:
  port: 8081
spring:
  application:
    name: my-goods
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.2.11:8850
        ip: 192.168.2.11
        username: nacos
        password: nacos

但是这种方式有个很明显的弊端,就是服务迁移时需要改动配置,多实例部署时需要频繁改动配置。

一个更优雅的方式

我们把配置改成如下:

server:
  port: 8081
spring:
  application:
    name: my-goods
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.2.11:8850
        ip: ${HOST_IP_ADDRESS:127.0.0.1}
        username: nacos
        password: nacos

docker-compose.yaml

version: '3.5'
services:
  my-goods:
    restart: always
    image: my-goods
    container_name: my-goods
    environment:
      HOST_IP_ADDRESS: $HOST_IP_ADDRESS
      TZ: Asia/Shanghai
    ports:
      - 8081:8081

在执行docker-compose前,将HOST_IP_ADDRESS输出到环境变量中

export HOST_IP_ADDRESS=$(ifconfig eth0 | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" | awk '{ print $2 }'| cut -f2 -"d:")

如此,使用容器部署的方式便优雅完成了~

边车挂载

奇技淫巧

当我们发现了奥秘:只要我们配了IP,配的IP是啥,注册到Nacos的IP就是啥。

掌握奇技淫巧的程序员们有没有想到一些骚操作呢?阿鉴这里却是想到了一个哦~

<img src="https://notes.zijiancode.cn/nacos/my-sidecar.png" style="zoom:50%;" />

  1. 新建一个my-sidecar服务,配置如下

    server:
      port: 8082
    spring:
      application:
        name: my-sidecar
      main:
        allow-bean-definition-overriding: true
      cloud:
        nacos:
          discovery:
            server-addr: 192.168.1.11:8850
            namespace: public
            service: my-integral
            ip: 192.168.65.91
            port: 8083
            username: nacos
            password: nacos
    
    management:
      endpoints:
        web:
          exposure:
            include: "*"
    
  2. 新建一个Spring Boot my-integral服务(注意不是SpringCloud服务,不集成Nacos),配置如下

    server:
      port: 8083
    spring:
      application:
        name: my-integral
    
  3. my-integral服务中编写接口

    @Slf4j
    @RestController
    @RequestMapping("/integral")
    public class IntegralController {
    
        @GetMapping("/remain")
        public String remain(){
            log.info("积分服务被调用了");
            Random random = new Random();
            int i = random.nextInt(100);
            return "您当前的积分为:" + i;
        }
    }
    
  4. 启动项目并打开控制台

    Nacos细节篇-LMLPHP

  5. my-order编写调用代码

    @RestController
    @RequestMapping("/order")
    public class OrderController {
    
        @Resource
        private RestTemplate restTemplate;
    
        @GetMapping("/integral")
        public String integral(){
            String url = "http://my-integral/integral/remain";
            return restTemplate.getForObject(url, String.class);
        }
    }
    
  6. 启动my-order测试

    Nacos细节篇-LMLPHP

回顾一下我们做了什么:我们使用配置ip的奥秘将一个并未集成Nacos的my-integral信息注册到了Nacos上,然后通过my-order成功发起了调用~

意义

这样做有什么意义呢?难道真就为了骚一把?不是的。

假设我们现在有这样的需求,有一个老项目old-project想要加入到微服务系统中,但是这个old-project集成Nacos的成本过高,那么我们就可以使用这样的方式了。

这里阿鉴偷偷告诉大家,这个方式其实有个术语,叫做:边车模式。

Nacos的边车模式

其实Nacos已经实现了边车模式,集成方式非常简单

  1. 在原Nacos项目(my-sidecar)中引入依赖

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-webflux</artifactId>
    </dependency>
    <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-starter-alibaba-sidecar</artifactId>
    </dependency>
    
  2. 编写配置

    server:
      port: 8082
    spring:
      application:
        name: my-sidecar
      main:
        allow-bean-definition-overriding: true
      cloud:
        nacos:
          discovery:
            server-addr: 192.168.1.11:8850
            service: my-integral
    sidecar:
      ip: 127.0.0.1
      port: 8083
      health-check-url: http://127.0.0.1:8083/integral/health
    
    management:
      endpoints:
        web:
          exposure:
            include: "*"
    
  3. my-integral服务中增加接口

    @RestController
    @RequestMapping("/integral")
    public class IntegralController {
    
        @GetMapping("/health")
        public Map<String,String> health(){
            Map<String, String> map = new HashMap<>(2);
            map.put("status", "UP");
            return map;
        }
    }
    
  4. 测试

    Nacos细节篇-LMLPHP

小结

本篇补充了关于Nacos的一些细节,首先介绍了Nacos的OpenAPI, 通过OpenAPI延伸出了如何进行容器部署,以及边车模式。

案例地址:https://gitee.com/lzj960515/my-micro-service-demo.git

看完之后想必有所收获吧~ 想要了解更多精彩内容,欢迎关注公众号:程序员阿鉴,阿鉴在公众号欢迎你的到来~

05-20 18:10