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

SpringCloudAlibaba系列之Nacos服务注册和配置中心(三)

一、实现目标项目[ac-mall-cloud]各module注册到Nacos服务,并通过Nacos服务名访问接口Nacos官网文档Nacos官

一、实现目标

项目[ac-mall-cloud]各module注册到Nacos服务,并通过Nacos服务名访问接口

Nacos官网文档
Nacos官方GitHub地址
Nacos官方下载地址

二、Nacos(Naming Configuration Service)简介

2.1 是什么

1、一个更易于构建云远程应用的动态服务发现,配置管理和服务管理平台
2、Nacos就是注册中心 + 配置中心的组合 等价于 Nacos = Eureka + Config + Bus

2.2 能干嘛

1、替代Eureka做服务注册中心
2、替代Config做服务配置中心

2.3 注册中心比较
Spring Cloud Alibaba系列之-Nacos服务注册和配置中心(三)
注册中心比较
Spring Cloud Alibaba系列之-Nacos服务注册和配置中心(三)
Nacos和CAP
Spring Cloud Alibaba系列之-Nacos服务注册和配置中心(三)
Nacos与其他注册中心特性对比
2.3.1 CAP 原则
  • C:一致性(Consistency)
  • A:可用性(Availability)
  • P:分区容错性(Partition tolerance)

P(分区容错):一般是针对多节点部署的系统,分区指网络分区(由于网络原因节点之间无法通信同步数据),容错指系统节点出现分区了对外依然要能提供服务,不能说分区了导致整个系统不能提供服务了。

在满足P的前提下,Client发一条数据给节点1,因为分区产生这条数据暂时无法同步给节点2。如果要保证整个分布式系统的数据一致性(C),肯定要牺牲掉可用性(A),也就是整个分布式系统对外暂时不可用,不然Client对节点1和节点2的这条数据查询的结果就不一致了。同样的道理,如果要保证A那肯定要牺牲掉C了,因为数据还没在节点间同步,Client查询节点1和节点2的这条数据结果肯定不一样。

2.3.2 BASE原则
  • BA:基本可用(Basically Available)
  • S:软状态(Soft State)
  • E:最终一致性(Eventual Consistency)

CAP原则是三选二,BASE原则是CAP的折中,C、A、P三个都要,但不用100%的保证每一个原则,分布式系统肯定优先保证P,多数时候是在C和A之间做权衡选择

2.3.3 各注册中心满足的CAP原则
  • mysql单机(CA)
  • eureka集群(AP)
  • zookeeper集群(CP)
  • nacos集群(AP或CP),临时节点走AP,持久化节点走CP
  • redis集群(AP)
2.3.4 脑裂问题

脑裂:集群(Master-Slave的情况)的脑裂通常是发生在节点之间通信不可达(分区)的情况下,集群会分裂成不同的小集群,小集群各自选出自己的master节点,导致原有的集群出现多个master节点的情况。

2.4 Nacos基础概念
2.4.1 Nacos服务发现和服务健康监测

Nacos 支持基于 DNS 和基于 RPC 的服务发现。服务提供者使用 原生SDK、OpenAPI、或一个独立的Agent TODO注册 Service 后,服务消费者可以使用DNS TODO 或HTTP&API查找和发现服务。

Nacos 提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。Nacos 支持传输层 (PING 或 TCP)和应用层 (如 HTTP、MySQL、用户自定义)的健康检查。 对于复杂的云环境和网络拓扑环境中(如 VPC、边缘网络等)服务的健康检查,Nacos 提供了 agent 上报模式和服务端主动检测2种健康检查模式。Nacos 还提供了统一的健康检查仪表盘,帮助您根据健康状态管理服务的可用性及流量。

2.4.2 命名空间

用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。

三、Nacos安装

可参考Nacos 快速开始、Nacos Spring Cloud 快速开始

3.1 windows环境安装

1、本地Java8+Maven环境已经OK

2、先从官网下载Nacos Nacos官方下载地址

Spring Cloud Alibaba系列之-Nacos服务注册和配置中心(三)
下载地址

3、解压安装包

Spring Cloud Alibaba系列之-Nacos服务注册和配置中心(三)
解压安装包

4、启动Nacos(错误示范)

Spring Cloud Alibaba系列之-Nacos服务注册和配置中心(三)
startup.cmd

在Nacos的低版本中,可以直接点击运行bin目录下的startup.cmd来启动Nacos,但在高版本中,则会启动失败,原因是高版本默认采用了集群模式,用到了数据库,而我们没有配置数据库,因此启动失败。

Spring Cloud Alibaba系列之-Nacos服务注册和配置中心(三)
启动失败

5、启动方式一
打开cmd命令窗口,在启动命令中指定单机模式运行

cd D:installnacos-server-2.0.0nacosbin startup.cmd -m standalone

Spring Cloud Alibaba系列之-Nacos服务注册和配置中心(三)
cmd命令窗口

运行成功后访问http://localhost:8848/nacos
默认账号nacos nacos

Spring Cloud Alibaba系列之-Nacos服务注册和配置中心(三)
Nacos控制台界面

6、启动方式二
用编辑器打开startup.cmd文件,找到set MODE="cluster",修改成set MODE="standalone",将默认的集群模式改成单机模式。此时再双击startup.cmd就可以启动Nacos了

Spring Cloud Alibaba系列之-Nacos服务注册和配置中心(三)
startup.cmd启动成功
3.2 Linux(ubuntu) 环境安装

1、将Nacos安装包文件上传到远程服务器

scp -r D:/install/nacos-server-2.0.0 root@[47.105.146.74](mailto:root@47.105.146.74):/data/nacos-server-2.0.0

2、登录远程服务器,启动Nacos

ssh root@47.105.146.74 输入密码 cd /data/nacos-server-2.0.0/nacos/bin

ubuntu 启动命令

bash startup.sh -m standalone

linux 启动命令

sh startup.sh -m standalone

Spring Cloud Alibaba系列之-Nacos服务注册和配置中心(三)
启动

可以通过命令查看启动日志

tail -f /data/nacos-server-2.0.0/nacos/logs/start.out -n 1000

Spring Cloud Alibaba系列之-Nacos服务注册和配置中心(三)
启动日志

4、Nacos控制台效果

Spring Cloud Alibaba系列之-Nacos服务注册和配置中心(三)
Nacos控制台效果

四、项目[ac-mall-cloud]接入Nacos

4.1 父级工程配置

在父级工程 [ac-mall-cloud] pom.xml中引入Nacos依赖

com.alibaba.cloudspring-cloud-starter-alibaba-nacos-discovery${alibaba.cloud.version}

父级工程 [ac-mall-cloud] pom.xml全配置如下

4.0.0org.exampleac-mall-cloud1.0-SNAPSHOTuser-serviceproduct-serviceorder-servicepom1.8Greenwich.SR18.0.173.2.01.1.102.2.4.RELEASE2.1.0.RELEASE1.18.10org.springframework.bootspring-boot-starter-parent${boot.version}pomimportorg.springframework.cloudspring-cloud-dependencies${spring-cloud.version}pomimportcom.alibaba.cloudspring-cloud-alibaba-dependencies${alibaba.cloud.version}pomimportcom.alibaba.cloudspring-cloud-starter-alibaba-nacos-discovery${alibaba.cloud.version}com.baomidoumybatis-plus-boot-starter${mybatis.plus.version}com.alibabadruid-spring-boot-starter${druid.version}mysqlmysql-connector-java${mysql.version}org.projectlomboklombok${lombok.version}providedorg.projectlomboklombok1.18.10providedorg.springframework.bootspring-boot-maven-plugin

4.2 module [user-service] 配置

1、在module [user-service]pom.xml中引入Nacos依赖

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

module [user-service]pom.xml全配置如下

ac-mall-cloudorg.example1.0-SNAPSHOT4.0.0org.acuser-serviceorg.springframework.bootspring-boot-starter-webcom.alibaba.cloudspring-cloud-starter-alibaba-nacos-discovery

2、在module [user-service]application.yml配置文件中配置Nacos注册中心信息

spring: cloud: nacos: discovery: server-addr: 47.105.146.74:8848

module [user-service]application.yml全配置如下

server: port: 8010 spring: application: name: user-service cloud: nacos: discovery: server-addr: 47.105.146.74:8848

3、补充说明
从Spring Cloud Edgware开始,@EnableDiscoveryClient可省略。只需加上相关依赖,并进行相应配置,即可将微服务注册到服务发现组件上。因此本项目中不需要在UserApplication启动类上加@EnableDiscoveryClient注解

4.3 module [order-service] 配置

module [order-service] 配置与[user-service]一样,此处省略

4.4 Naocs控制台

配置完成后,登录Naocs控制台,效果如下

Spring Cloud Alibaba系列之-Nacos服务注册和配置中心(三)
Naocs控制台效果
4.4 改造module[user-service]和modul[order-service]RestTemplate的通信

将RestTemplate由IP访问,改成用服务名访问

@Service public class OrderServiceImpl implements IOrderService { @Autowired OrderDao orderDao; @Autowired RestTemplate restTemplate; //final static String USER_SERVICE_URL="http://127.0.0.1:8010/users/{userId}"; final static String USER_SERVICE_URL="http://user-service/users/{userId}"; //用服务名来替换IP public Order makeOrder(String productId, String userId) { /** * RestTemplate是java创造出来的,在java能够访问到网络资源的包是java.net.URLConnenction/Socket * RestTemplate是对URLConnenction的封装 * apache--HttpClient 也是对URLConnenction/HttpURLConnenction的封装 * oKHttp 也封装了URLConnenction * netty/rpc/grpc/thirt/tomcat */ // 1、根据用户ID调用用户服务接口数据,查询用户的名字 UserDto userDto = restTemplate.getForObject(USER_SERVICE_URL,UserDto.class,userId); String userName=userDto.getUserName(); // 2、生成订单 Order order = new Order(); order.setId(UUID.randomUUID().toString()); order.setCreateTime(new Date()); order.setPriceFen(1600L); order.setUserId(userId); order.setUserName(userName); order.setProductId(productId); order.setOrderNo(UUID.randomUUID().toString()); // 3、保存数据库 orderDao.insert(order); return order; } }

我们在浏览器中输入访问地址http://127.0.0.1:8020/orders/1/1 发现接口访问失败,控制台打印出异常信息java.net.UnknownHostException: user-service 这是因为RestTemplate无法识别Nacos注册中心中的user-service服务名。

由于Nacos服务注册与发现功能中,默认集成了Ribbon,因此我们可以在RestTemplate添加Ribbon注解,让Ribbon来解决识别服务名的问题。

在module[order-service]的OrderApplication中加入Ribbon注解@LoadBalanced,代码如下

@SpringBootApplication public class OrderApplication { public static void main(String[] args) { SpringApplication.run(OrderApplication.class); } @Bean @LoadBalanced // Ribbon负载均衡注解 RestTemplate getRestTemplate(){ return new RestTemplate(); } }

重启module[order-service],再次访问http://127.0.0.1:8020/orders/1/1 ,发现与之前用IP方式通信的效果一样了

Spring Cloud Alibaba系列之-Nacos服务注册和配置中心(三)
image.png

五、Nacos重点补充

5.1 Nacos如何支持多环境

在日常使用中常常需要不同的环境,比如日常,预发,线上环境,如果是逻辑隔离可以使用命名空间,Nacos支持命名空间来支持多环境隔离,可以在Nacos控制台创建多个命名空间。如果需要物理隔离,就要部署多套Nacos环境。

5.2 Nacos有什么依赖

在单机模式下,Nacos没有任何依赖,在集群模式下,Nacos依赖Mysql做存储。

5.3 Nacos单机部署如何使用mysql

Nacos单机模式默认使用内嵌的数据库作为存储引擎,如果想换成自己安装的mysql也可以进行相关的配置。

5.4 生产环境如何部署Nacos

生产环境使用Nacos为了达到高可用不能使用单机模式,需要搭建nacos集群。

5.5 Nacos部署环境

Nacos定义为一个IDC内部应用组件,并非面向公网环境的产品,建议在内部隔离网络环境中部署,强烈不建议部署在公共网络环境。

备注:应用内部流量可以走专用端口,然后在防火墙和安全组指定这个端口只允许你的其他服务器 IP 访问,更多安全配置可参考Nacos 配置安全最佳实践

5.6 Nacos支持三种部署模式
  • 单机模式 – 用于测试和单机试用。
  • 集群模式 – 用于生产环境,确保高可用。
  • 多集群模式 – 用于多数据中心场景。

六、问题思考

Nacos服务做集群时,服务A调用服务B,服务B有B1、B2、B3 三个服务,现在B1要更新发布新代码,会有几秒的短暂不可用,如果此时服务A刚好访问的是服务B1,那么对应功能就会出现不可用的情况。其实针对这个问题可用通过Sentinel服务降级与熔断来解决。

七、附录

项目源码地址

八、参考资料

Nacos 配置安全最佳实践


推荐阅读
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 新手学习java中,Java新手
    本文目录一览:1、java初学者怎么入门2、新 ... [详细]
  • #python没有类似于java和C#的接口类(interface),需要使用抽象类和抽象方法来实现接口功能#!usrbinenvpython#_*_coding ... [详细]
  • Python实现变声器功能(萝莉音御姐音)的方法及步骤
    本文介绍了使用Python实现变声器功能(萝莉音御姐音)的方法及步骤。首先登录百度AL开发平台,选择语音合成,创建应用并填写应用信息,获取Appid、API Key和Secret Key。然后安装pythonsdk,可以通过pip install baidu-aip或python setup.py install进行安装。最后,书写代码实现变声器功能,使用AipSpeech库进行语音合成,可以设置音量等参数。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 20211101CleverTap参与度和分析工具功能平台学习/实践
    1.应用场景主要用于学习CleverTap的使用,该平台主要用于客户保留与参与平台.为客户提供价值.这里接触到的原因,是目前公司用到该平台的服务~2.学习操作 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • intellij idea的安装与使用(保姆级教程)
    intellijidea的安装与使用(保姆级教程)IntelliJ在业界被公认为最好的java开发工具,尤其在智能代码助手、代码自动提示、重构、JavaEE支持、各类版本工具(gi ... [详细]
  • STM32与FPGA的对比及学习建议
    本文对比了野火STM32F103指南针板和Xilinx的PYNQ-Z2板(ZYNQ-7020),介绍了野火STM32F103指南针板的学习资料和讲解视频的详细程度,建议初学者学习野火的资料。同时,介绍了STM32开发所用的Keil程序和C指针的重要性。对于ZYNQ-7020的开发,提到了其自带的Linux、Ubuntu18.4系统以及使用SD卡烧入镜像的方法。 ... [详细]
  • 背景应用安全领域,各类攻击长久以来都危害着互联网上的应用,在web应用安全风险中,各类注入、跨站等攻击仍然占据着较前的位置。WAF(Web应用防火墙)正是为防御和阻断这类攻击而存在 ... [详细]
  • EasyCVR如何通过接口调用设备录像的倍速回放?
    本文介绍了EasyCVR平台通过接口调用设备录像的倍速回放的步骤,包括登录接口、获取设备和通道接口、播放设备录像、回放控制接口等。EasyCVR平台支持多种设备接入方式和流媒体处理分发,适用于各种场景,如智慧工地、智慧工厂、智慧校园等。用户可以前往演示平台进行体验或部署测试。 ... [详细]
  • Spring框架《一》简介
    Spring框架《一》1.Spring概述1.1简介1.2Spring模板二、IOC容器和Bean1.IOC和DI简介2.三种通过类型获取bean3.给bean的属性赋值3.1依赖 ... [详细]
  • 本文介绍了在Ubuntu 11.10 x64环境下安装Android开发环境的步骤,并提供了解决常见问题的方法。其中包括安装Eclipse的ADT插件、解决缺少GEF插件的问题以及解决无法找到'userdata.img'文件的问题。此外,还提供了相关插件和系统镜像的下载链接。 ... [详细]
author-avatar
zhangjy妍
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有