SpringCloudAlibaba+Nacos+Dubbo通过K8S NodePort暴露服务

本文介绍了在K8S环境中,如何通过HostNetwork和NodePort解决微服务IP与端口问题,提高本地调试效率。通过设置环境变量DUBBO_IP_TO_REGISTRY和DUBBO_PORT_TO_REGISTRY实现Dubbo服务在Nacos的正确注册。同时,详细展示了SpringCloudAlibaba微服务在Nacos的配置,并分析了Dubbo元数据服务的URL绑定问题。
摘要由CSDN通过智能技术生成

场景

我们的Dev环境是使用了K8S来部署微服务。但默认的容器ip是随机的,而且每次发布都会发生变更,微服务RPC调用也调不通容器内部的IP。而且后期项目微服务一多起来,要在本地调试就要把所有服务都起了,效率很低。

后来我们通过用Host Network网络方式直接让容器使用宿主机的IP,端口也是直接挂在了宿主机。这样可以本地就可以直接访问Dev环境的微服务,而本地只需要针对启动某些要调试的服务即可,大大提高了调试效率。

但过了一段时间后,我们发现了一个比较麻烦的问题时,在同一微服务在K8S Dev环境中有在多个命名空间下运行,且运行节点一致,那么所涉及端口又是固定出去的就会产生冲突。随后我们想到了利用NodePort方式来进行映射端口来暴露服务就能解决这个问题。

当然如果有条件的可以通过开放K8S网络环境连通公司内部网络。具体可以参考这篇文章:打通Kubernetes内网与局域网的N种方法

环境

  • K8S + Rancher 2.6.3
  • SpringCloud Alibaba 2.2.5.RELEASE
  • Nacos 2.0.3
  • Dubbo 2.7.8

配置K8S Deployment

端口映射

  1. Web端口,SpringBoot、Tomcat之流一般都是8080。
  2. Dubbo端口,一般按默认规则都是20880。

环境变量

  1. DUBBO_IP_TO_REGISTRY = Node IP
  2. DUBBO_PORT_TO_REGISTRY = Dubbo端口映射端口
  3. WEB_PORT_TO_REGISTRY = Web端口映射端口

DUBBO_* 的变量是Dubbo框架内置的变量key。有兴趣可以看看这段源码:org.apache.dubbo.config.ServiceConfig#doExportUrlsFor1Protocol

org.apache.dubbo.config.ServiceConfig#findConfigedHosts

org.apache.dubbo.config.ServiceConfig#findConfigedPorts

配置微服务bootstrap.yml

server:
  port: 8080
spring:
  application:
    name: test-dubbo
  cloud:
    nacos:
      discovery:
        # Nacos地址
        server-addr: 192.168.100.10
        # 命名空间
        namespace: np
        # 组
        group: service
        # 注册到Nacos的服务ip(通过环境变量注入)
        ip: ${DUBBO_IP_TO_REGISTRY}
        # 注册到Nacos的服务端口(通过环境变量注入)
        port: ${WEB_PORT_TO_REGISTRY}
      config:
        # Nacos地址
        server-addr: 192.168.100.10
        # 命名空间
        namespace: np
        # 组
        group: config
        # 配置文件格式
        file-extension: yml
dubbo:
  scan:
    # dubbo 服务扫描基准包
    base-packages: com.test
  protocol:
    # dubbo 协议
    name: dubbo
    # dubbo 协议端口( -1 表示自增端口,从 20880 开始)
    port: -1
  registry:
    # 挂载到 Spring Cloud 注册中心
    address: spring-cloud://192.168.100.10
    group: ${spring.cloud.nacos.discovery.group}
  cloud:
    # 订阅服务(支持多个,使用","分隔。默认为"*",表示订阅所有应用)
    subscribed-services: "*"

Nacos注册效果


如上图所示的注册效果,即可在本地连到K8S Dev环境中的test-dubbo服务啦。

细心的观众可能看出来dubbo.metadata-service.urls中的bind.ipbind.port参数还是容器的IP端口,因为这两个参数是用于Netty绑定网络IP端口所用的,不能直接用NodePort映射出来的。不然其实可以直接在bootstrap.yml里面配置dubbo.protocol.hostdubbo.protocol.port,可惜因为这个特性故而只能借助上述环境变量才可做到更改Dubbo url上的IP端口且不影响Netty。具体可以看看这段源码:
org.apache.dubbo.config.ServiceConfig#doExportUrlsFor1Protocol

org.apache.dubbo.remoting.transport.netty.NettyServer
org.apache.dubbo.remoting.transport.AbstractServer#AbstractServer

原创不易,转载请注明出处,谢谢。

您好!要搭建Spring Cloud Alibaba Nacos项目,您可以按照以下步骤进行操作: 1. 创建Spring Boot项目:首先,在您的IDE中创建一个新的Spring Boot项目。 2. 添加依赖:在项目的pom.xml文件中添加相应的依赖。您需要添加以下四个核心依赖: ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> ``` 3. 配置Nacos Server地址:在application.properties(或application.yml)文件中配置Nacos Server的地址。例如: ```yaml spring.cloud.nacos.discovery.server-addr=${NACOS_SERVER_ADDR:localhost:8848} ``` 4. 创建服务提供者和消费者:根据您的需求,创建相应的服务提供者和消费者。您可以使用`@RestController`注解创建简单的RESTful接口。 5. 注册服务:在服务提供者的主类上添加`@EnableDiscoveryClient`注解,以将服务注册到Nacos Server上。 6. 调用服务:在服务消费者中使用`@RestTemplate`或Feign等方式调用服务。您可以通过在方法上添加`@LoadBalanced`注解来实现负载均衡。 7. 启动应用程序:最后,启动应用程序并验证各个微服务之间的通信是否正常。 这些是搭建Spring Cloud Alibaba Nacos项目的基本步骤。根据您的具体需求,您可能还需要配置其他功能,如动态配置等。希望对您有帮助!如有更多问题,请随时提问。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值