热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Nacos细节篇

摘要:原创地址:https://zijiancode.cn/archives/nacos-detail,欢迎转载,转载时请保留摘要,谢谢! 环境:Nacos 1.4.2 在前两篇:Nacos注册中心实

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

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

> 有时候一个小细节就能使人自闭

OpenAPI

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

> 更多OpenAPI可查看Nacos官网:https://nacos.io/zh-cn/docs/open-api.html

注册实例接口

接口:/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控制台查看效果

    > 由于只传了必要参数,所以命名空间和分组名称都是默认的。 > > 注意:由于我们只注册了实例,并未定时发送心跳,所以实例会在一定时间内被Nacos剔除

  3. 打开详情

    > ip和端口号即为我们填入的信息

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 

> 此时我们并未使用ip和port配置,Nacos将自动发现本地ip地址进行注册, port则使用server.port

现在我们将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

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

order-dtail

> 此时IP和端口就成了我们实际配置了的

> 心急的小伙伴这时候可能就会给阿鉴个大嘴巴子:讲那么多,这有啥用?! > > 阿鉴:不急不急

容器部署

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

> 多实例部署时,谁关心你的本机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 

> 此时my-goods注册到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 

> 此时ip配置中增加了变量:HOST_IP_ADDRESS

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输出到环境变量HOST_IP_ADDRESS中 > > 这个步骤可根据不同的部署工具进行执行,比如阿鉴用的是gitlab-ci,就是在gitlab-ci中执行的。

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

边车挂载

奇技淫巧

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

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

> my-sidercar将my-integral的信息注册到Nacos上

  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: "*" 

    > 注册到Nacos的信息是my-integral服务的

  2. 新建一个Spring Boot my-integral服务(注意不是SpringCloud服务,不集成Nacos),配置如下

    server: port: 8083 spring: application: name: my-integral 

    > spring.application.name 配置加不加无所谓

  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. 启动项目并打开控制台

    > 该信息是由my-sidecar注册而来,而非my-integer所注册的,因为my-integral并未集成Nacos

  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测试

    > 服务调用成功了

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

意义

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

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

> 这样的方式支持非Java语言哦~

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

Nacos的边车模式

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

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

     org.springframework.boot spring-boot-starter-webflux   com.alibaba.cloud spring-cloud-starter-alibaba-sidecar  
  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: "*" 

    > ip:my-integral的IP > > port: my-integral的端口 > > health-check-url: my-integral的健康检查地址

  3. my-integral服务中增加接口

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

    > 返回的内容必须是:status: UP

  4. 测试

小结

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

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

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


推荐阅读
  • 基于iSCSI的SQL Server 2012群集测试(一)SQL群集安装
    一、测试需求介绍与准备公司计划服务器迁移过程计划同时上线SQLServer2012,引入SQLServer2012群集提高高可用性,需要对SQLServ ... [详细]
  • Spring Boot 中配置全局文件上传路径并实现文件上传功能
    本文介绍如何在 Spring Boot 项目中配置全局文件上传路径,并通过读取配置项实现文件上传功能。通过这种方式,可以更好地管理和维护文件路径。 ... [详细]
  • 本文详细介绍了 InfluxDB、collectd 和 Grafana 的安装与配置流程。首先,按照启动顺序依次安装并配置 InfluxDB、collectd 和 Grafana。InfluxDB 作为时序数据库,用于存储时间序列数据;collectd 负责数据的采集与传输;Grafana 则用于数据的可视化展示。文中提供了 collectd 的官方文档链接,便于用户参考和进一步了解其配置选项。通过本指南,读者可以轻松搭建一个高效的数据监控系统。 ... [详细]
  • 在CentOS 7环境中安装配置Redis及使用Redis Desktop Manager连接时的注意事项与技巧
    在 CentOS 7 环境中安装和配置 Redis 时,需要注意一些关键步骤和最佳实践。本文详细介绍了从安装 Redis 到配置其基本参数的全过程,并提供了使用 Redis Desktop Manager 连接 Redis 服务器的技巧和注意事项。此外,还探讨了如何优化性能和确保数据安全,帮助用户在生产环境中高效地管理和使用 Redis。 ... [详细]
  • 本文详细介绍了如何在 Linux 系统上安装 JDK 1.8、MySQL 和 Redis,并提供了相应的环境配置和验证步骤。 ... [详细]
  • 使用ArcGIS for Java和Flex浏览自定义ArcGIS Server 9.3地图
    本文介绍了如何在Flex应用程序中实现浏览自定义ArcGIS Server 9.3发布的地图。这是一个基本的入门示例,适用于初学者。 ... [详细]
  • 本文介绍如何在 Android 中自定义加载对话框 CustomProgressDialog,包括自定义 View 类和 XML 布局文件的详细步骤。 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • 在Cisco IOS XR系统中,存在提供服务的服务器和使用这些服务的客户端。本文深入探讨了进程与线程状态转换机制,分析了其在系统性能优化中的关键作用,并提出了改进措施,以提高系统的响应速度和资源利用率。通过详细研究状态转换的各个环节,本文为开发人员和系统管理员提供了实用的指导,旨在提升整体系统效率和稳定性。 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • Keepalived 提供了多种强大且灵活的后端健康检查机制,包括 HTTP_GET、SSL_GET、TCP_CHECK、SMTP_CHECK 和 MISC_CHECK 等多种检测方法。这些健康检查功能确保了高可用性环境中的服务稳定性和可靠性。通过合理配置这些检查方式,可以有效监测后端服务器的状态,及时发现并处理故障,从而提高系统的整体性能和可用性。 ... [详细]
  • C++ 异步编程中获取线程执行结果的方法与技巧及其在前端开发中的应用探讨
    本文探讨了C++异步编程中获取线程执行结果的方法与技巧,并深入分析了这些技术在前端开发中的应用。通过对比不同的异步编程模型,本文详细介绍了如何高效地处理多线程任务,确保程序的稳定性和性能。同时,文章还结合实际案例,展示了这些方法在前端异步编程中的具体实现和优化策略。 ... [详细]
  • 在Linux系统中,网络配置是至关重要的任务之一。本文详细解析了Firewalld和Netfilter机制,并探讨了iptables的应用。通过使用`ip addr show`命令来查看网卡IP地址(需要安装`iproute`包),当网卡未分配IP地址或处于关闭状态时,可以通过`ip link set`命令进行配置和激活。此外,文章还介绍了如何利用Firewalld和iptables实现网络流量控制和安全策略管理,为系统管理员提供了实用的操作指南。 ... [详细]
  • 安装 IIS 5.1 并注册 .NET 2.0 后,访问页面时出现 500 错误。本文提供详细的步骤和解决方案,帮助您解决该问题。 ... [详细]
  • Linux CentOS 7 安装PostgreSQL 9.5.17 (源码编译)
    近日需要将PostgreSQL数据库从Windows中迁移到Linux中,LinuxCentOS7安装PostgreSQL9.5.17安装过程特此记录。安装环境&#x ... [详细]
author-avatar
-林之涵_396
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有