Alibaba微服务组件——Nacos服务注册中心,从0到0.5
naocs
目录
4,创建mysql数据库nacos,并执行脚本conf\nacos-msyql.sql
一,简介
1,Nacos简介
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
一个更易于构建云原生应用的动态服务发现,配置管理和服务管理中心
Nacos就是 注册中心+配置中心+服务管理 的组合
Nacos主要功能:
- 服务发现和服务运行状况检查:①使服务可以轻松注册自身,②并通过DNS或HTTP接口发现其他服务;③同时实时检查服务的运行状况,防止向运行状况不佳的主机或服务实例发送请求;
- 动态配置管理:集中和动态的管理所有服务的配置,同时在更新配置时自动更新客户端的配置,而无需重新部署应用程序和服务;
- 动态域名解析:支持加权路由,轻松实现负载均衡、灵活的路由策略、流量控制和简单的DNS解析服务器;轻松实现基于DNS的服务发现,并防止应用程序耦合到特点的API;
- 服务和元数据管理:提供了易于使用的服务仪表板,方便管理服务元数据、配置、服务运行状态和指标统计信息。
Nacos中文官方文档https://nacos.io/zh-cn/docs/what-is-nacos.htmlspringcloud alibaba的github中文文档https://github.com/alibaba/spring-cloud-alibaba/wiki
2,Nacos注册中心简介
服务发现是微服务架构体系中最关键的组件之一。如果尝试着用手动的方式来给每一个客户端来配置所有服务提供者的服务列表是一件非常困难的事,而且也不利于 服务的动态扩缩容。Nacos Discovery Starter 可以帮助您将服务自动注册到 Nacos 服务端并且能够动态感知和刷新某个服务实例的服务列表。除此之外,Nacos Discovery Starter 也将服务实例自身的一些元数据信息-例如 host,port,健康检查URL,主页等-注册到 Nacos 。
也就是说,启动服务的时候,会将自身注册到nacos注册中心中,当存在服务A调用服务B时,服务A会到注册中心寻找服务B的信息。
二,主流注册中心比较
三,安装运行Nacos
Nacos 依赖 java 环境来运行,需要安装JDK。
如果是从代码开始构建并运行Nacos,还需要为此配置 maven 环境,请确保是在以下版本环境中安装使用:
- 64 bit OS,支持 Linux/Unix/Mac/Windows,推荐选用 Linux/Unix/Mac。
- 64 bit JDK 1.8+;
- Maven 3.2.x+;
1,下载
2,解压
tar -zxvf nacos-server-2.0.3.tar.gz
3,以单机模式启动nacos
进入nacos/bin目录中:
./startup.sh -m standalone
4,查看日志文件
5,进入控制台
从日志可知,控制台地址为:http://192.168.72.129:8848/nacos
默认用户名密码都是:nacos
注意:记得linux防火墙放行8848端口
#查看防火墙规则
firewall-cmd --list-all#查询端口是否开放
firewall-cmd --query-port=8848/tcp#关闭端口(--permanent参数表示设置为永久)
firewall-cmd --permanent --remove-port=8848/tcp#1,开启端口
firewall-cmd --permanent --add-port=8848/tcp#2,重启防火墙
firewall-cmd --reload
四,单机模式部署
Nacos支持三种部署模式:
- 单机模式 - 用于测试和单机试用。
- 集群模式 - 用于生产环境,确保高可用。
- 多集群模式 - 用于多数据中心场景。
1,创建父项目
2,创建两个服务
3,引入相关依赖
①父pom文件引入spring-cloud-alibaba-dependencies
spirngboot、springcloud换个springbootAlibaba等版本需要进行版本对应,具体对应版本可参见如下:
②在两个服务的pom文件中分别加入spring-cloud-starter-alibaba-nacos-discovery
4,配置nacos
在两个服务的application.yml配置文件中
5,启动两个服务
启动报错:
原因:
所以,服务器防火墙需要放行9848和9849两个端口
参考官网文档:
Nacos 2.0.0 兼容性文档https://nacos.io/zh-cn/docs/2.0.0-compatibility.html
此时,这两个服务已经自动注入到nacos服务列表中:
6,在调用服务端添加负载均衡器注解
7,在调用服务端设置调用路径
8,浏览器访问
五、重要概念
1,服务名
服务提供的标识,通过该标识可以唯一确定其指代的服务;在服务间相互调用时,通过服务名代替ip:端口号指定要调用的服务。
2,服务
每个注册到nacos中的服务,提供给客户端的软件功能。
3,服务分组
不同的服务可以归类到同一分组。根据分组名称指定服务分组。
4,命名空间
用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
nacos默认有一个名叫pulic的空间。
5,健康检查
以指定方式检查服务下挂载的实例的健康度,从而确定该实力是否能提供服务;根据检查结果,实例 (Instance) 会被判断为健康或不健康。对服务发起解析请求时,不健康的实例 (Instance) 不会返回给客户端。
六、集群模式部署
1,准备三台服务器
192.168.72.129
192.168.72.130
192.168.72.131
2,配置外源数据库
修改canos的配置文件conf/application.properties的外源数据库的配置
注意:不能使用内置数据库,否则三台canos使用的不是同一个数据库
3,配置集群节点
修改canos的配置文件conf/cluster.conf.example名称为cluster.conf
并添加节点配置
4,创建mysql数据库nacos,并执行脚本conf\nacos-msyql.sql
5,如果出现内存不足
修改i启动脚本bin\startup.sh的jvm参数
我的虚拟机内存只有1g,所以我在此修改:
6,启动nacos
./startup.sh -cluster
打印日志启动成功
7,浏览器查看
七, nginx配置反向代理
1,nginx配置
2,浏览器访问
3,修改客户端配置
4,启动失败
com.alibaba.nacos.api.exception.NacosException: Request nacos server failed:
at com.alibaba.nacos.client.naming.remote.gprc.NamingGrpcClientProxy.requestToServer(NamingGrpcClientProxy.java:279) ~[nacos-client-2.0.3.jar:na]
at com.alibaba.nacos.client.naming.remote.gprc.NamingGrpcClientProxy.doSubscribe(NamingGrpcClientProxy.java:227) ~[nacos-client-2.0.3.jar:na]
at com.alibaba.nacos.client.naming.remote.gprc.NamingGrpcClientProxy.subscribe(NamingGrpcClientProxy.java:212) ~[nacos-client-2.0.3.jar:na]
at com.alibaba.nacos.client.naming.remote.NamingClientProxyDelegate.subscribe(NamingClientProxyDelegate.java:147) ~[nacos-client-2.0.3.jar:na]
at com.alibaba.nacos.client.naming.NacosNamingService.subscribe(NacosNamingService.java:393) ~[nacos-client-2.0.3.jar:na]
at com.alibaba.cloud.nacos.discovery.NacosWatch.start(NacosWatch.java:134) ~[spring-cloud-starter-alibaba-nacos-discovery-2.2.7.RELEASE.jar:2.2.7.RELEASE]
at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:182) [spring-context-5.2.15.RELEASE.jar:5.2.15.RELEASE]
at org.springframework.context.support.DefaultLifecycleProcessor.access$200(DefaultLifecycleProcessor.java:53) [spring-context-5.2.15.RELEASE.jar:5.2.15.RELEASE]
at org.springframework.context.support.DefaultLifecycleProcessor$LifecycleGroup.start(DefaultLifecycleProcessor.java:360) [spring-context-5.2.15.RELEASE.jar:5.2.15.RELEASE]
at org.springframework.context.support.DefaultLifecycleProcessor.startBeans(DefaultLifecycleProcessor.java:158) [spring-context-5.2.15.RELEASE.jar:5.2.15.RELEASE]
at org.springframework.context.support.DefaultLifecycleProcessor.onRefresh(DefaultLifecycleProcessor.java:122) [spring-context-5.2.15.RELEASE.jar:5.2.15.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:895) [spring-context-5.2.15.RELEASE.jar:5.2.15.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:554) [spring-context-5.2.15.RELEASE.jar:5.2.15.RELEASE]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:143) [spring-boot-2.3.12.RELEASE.jar:2.3.12.RELEASE]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:755) [spring-boot-2.3.12.RELEASE.jar:2.3.12.RELEASE]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:747) [spring-boot-2.3.12.RELEASE.jar:2.3.12.RELEASE]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:402) [spring-boot-2.3.12.RELEASE.jar:2.3.12.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:312) [spring-boot-2.3.12.RELEASE.jar:2.3.12.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1247) [spring-boot-2.3.12.RELEASE.jar:2.3.12.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1236) [spring-boot-2.3.12.RELEASE.jar:2.3.12.RELEASE]
at com.stock.StockApplication.main(StockApplication.java:11) [classes/:na]
Caused by: com.alibaba.nacos.api.exception.NacosException: Client not connected,current status:STARTING
at com.alibaba.nacos.common.remote.client.RpcClient.request(RpcClient.java:655) ~[nacos-client-2.0.3.jar:na]
at com.alibaba.nacos.common.remote.client.RpcClient.request(RpcClient.java:635) ~[nacos-client-2.0.3.jar:na]
at com.alibaba.nacos.client.naming.remote.gprc.NamingGrpcClientProxy.requestToServer(NamingGrpcClientProxy.java:269) ~[nacos-client-2.0.3.jar:na]
... 20 common frames omitted
2022-01-04 11:23:18.991 INFO 10900 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2022-01-04 11:23:19.307 ERROR 10900 --- [ main] c.a.c.n.registry.NacosServiceRegistry : nacos registry, stock-service register failed...NacosRegistration{nacosDiscoveryProperties=NacosDiscoveryProperties{serverAddr='192.168.72.132:80', endpoint='', namespace='', watchDelay=30000, logName='', service='stock-service', weight=1.0, clusterName='DEFAULT', group='DEFAULT_GROUP', namingLoadCacheAtStart='false', metadata={preserved.register.source=SPRING_CLOUD}, registerEnabled=true, ip='192.168.72.1', networkInterface='', port=8080, secure=false, accessKey='', secretKey='', heartBeatInterval=null, heartBeatTimeout=null, ipDeleteTimeout=null, failFast=true}},
目前还没有找到问题的原因!!!
5,问题解决!
换了一下springcloud aibaba的版本问题便得到了解决,但具体原因尚不明晰!
(当然需要匹配对应的springboot版本和springcloud版本。)
spirngboot、springcloud换个springbootAlibaba等版本需要进行版本对应,具体对应版本可参见如下:
在服务中只需要配置nginx服务器的地址,即可访问nacos集群。
6,结构图
更多推荐
所有评论(0)