当前位置: 代码迷 >> 综合 >> SpringCloudAlibaba-服务注册与发现及配置中心-Nacos
  详细解决方案

SpringCloudAlibaba-服务注册与发现及配置中心-Nacos

热度:81   发布时间:2023-12-12 12:46:42.0

一、Nacos简介

Nacos致力于帮助您发现,配置和管理微服务。它提供了一组简单有用的功能,使您能够实现动态服务发现,服务配置,服务元数据和流量管理。
Nacos使构建,交付和管理微服务平台变得更容易,更快捷。它是通过微服务或云原生方法支持以服务为中心的现代应用程序体系结构的基础架构。
Nacos不仅是服务发现组件,同时也是一个配置管理组件,也就是说它不仅可以用来取代Eureak作为注册中心, 也可以用来取代Spring Cloud Config 做配置统一管理。

二、Nacos安装

一.下载地址

https://github.com/alibaba/nacos/releases

二.简单单机启动(WINDOWS下,单体架构)

1、需要配置JAVA环境,MYSQL数据库(可选),MAVEN

版本别太低

2、修改startup.cmd配置文件

set MODE="cluster"//集群模式
set MODE="standalone"//单机模式,这里使用单机模式,集群模式需要进一步配置,否则会启动报错。

或者也可以不修改,这样启动

startup.cmd -m standalone

3、修改startup.cmd配置文件

#*************** Config Module Related Configurations ***************#
### If use MySQL as datasource:spring.datasource.platform=mysql### Count of DB:db.num=1### Connect URL of DB:db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTCdb.user.0=rootdb.password.0=root

修改好之后就可以去启动了,默认账号密码是nacos/nacos

三.简单单机启动(Linux下,单体架构)

1、需要配置JAVA环境,MYSQL数据库(可选),MAVEN

2、修改startup.cmd配置文件

3、启动

cd 到安装目录的bin下
sh startup.sh -m standalone

http://IP:8848/nacos,不能只输入端口号,只输入端口会提示404。

四.集群配置(WINDOWS)

1、配置文件

#cluster.conf
#2021-04-27T12:16:26.198
10.94.35.213:8848
10.94.35.213:8850
10.94.35.213:8952

2、遇到问题

配置集群三个服务,有一个启动不起来,将参数适当改小可以解决。

 set "NACOS_JVM_OPTS=-server -Xms1g -Xmx1g -Xmn512m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m -XX:-OmitStackTraceInFastThrow -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=%BASE_DIR%\logs\java_heapdump.hprof -XX:-UseLargePages"

3、执行SQL命令

参照上面的,修改配置文件

4、启动(分别启动,无顺序,随意)

在这里插入图片描述
等三个都启动起来之后,可以直接在前端界面看到。

五.集群配置(linux)

1、修改配置文件配置数据库

懒得写了,截个图算了。
在这里插入图片描述

2、Cluster.conf配置不同服务器IP及其端口号

这里可以写同一个IP下的不同端口,也可以写不同IP的。

注意这里的IP不能写127.0.0.1必须写Linux命令下hostname -i能够识别的IP。
如果是真集群

IP1:端口 nacos1
IP2:端口 nacos2
IP3:端口 nacos3

3、修改startup.sh,设置可以进行指定端口启动(老版本没有,新版本已经有了)

1.第一步

添加 p参数,有的高版本可能p已经被其他参数占了,换一个就行
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

六.集群配置(docker,nacos 2.0.3版本,mysql 8.0.26)

1、下载

docker pull docker.io/nacos/nacos-server

2、分别启动三个(nacos建议是三个即三个以上进行启动,三个以上才能形成集群)

注意:Docker启动nacos并不是容器启动成功了,就代表服务启动成功了。
最好是可以实时的看一下输出了什么日志或者报错

dockers logs 容器ID -f

搭建集群遇到了很多报错

Docker搭建nacos集群报错:OutOfMemoryError:Metaspace

Nacos 2.0+版本 docker部署要多暴露两个端口

Nacos客户端连接报错,报ErrCode:503, ErrMsg:server is DOWN now, please try again later!

我是用了两台服务器,一台启动两个nacos,另一台启动一个nacos

docker run -d \
-e PREFER_HOST_MODE=hostname \
-e MODE=cluster \
-e NACOS_APPLICATION_PORT=8848 \
-e NACOS_SERVERS="119.91.99.85:8848 119.91.99.85:8847 139.155.49.250:8846" \
-e SPRING_DATASOURCE_PLATFORM=mysql \-e MYSQL_DATABASE_NUM=1 \
-e MYSQL_SERVICE_HOST=139.155.49.250 \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=xxxx\
-e MYSQL_SERVICE_DB_NAME=nacos_config \-e NACOS_USER=nacos \-e NACOS_PASSWORD=nacos \
-e NACOS_SERVER_IP=119.91.99.85 \
-p 8848:8848 \
-p 9848:9848 \
-p 9849:9849 \
--name nacos-8848 \docker run -d \
-e MODE=cluster \
-e NACOS_APPLICATION_PORT=8850 \
-e NACOS_SERVERS="119.91.99.85:8848 139.155.49.250:8848 119.91.99.85:8850" \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=139.155.49.250 \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=xxxx\
-e MYSQL_SERVICE_DB_NAME=nacos_config \
-e NACOS_SERVER_IP=119.91.99.85 \
-e JVM_XMS=512m -e JVM_XMX=512m -e JVM_XMN=512m \
-p 8850:8850 \
-p 9850:9850 \
-p 9851:9851 \
--name nacos8850 \
--restart=always \
nacos/nacos-server

3、配置NGINX代理这三个端口

1.下载nginx

docker pull docker.io/nginx

2.启动nginx

使用docker安装nginx,需要先随便安装一个不挂载配置文件的nginx然后复制出配置文件,然后删掉当前nginx,然后再次安装挂载配置文件的nginx

(1).先随便启动一个,为的是获取配置文件。
docker run --name nginx-test -p 7777:80 -d nginx
(2).从启动的容器中复制出配置文件

先创建好准备存放配置文件的路径

mkdir /usr/local/nginx -p

将配置文件复制出来
CP 容器名称或ID:/文件目录 目标目录

docker cp nginx-test:/etc/nginx/nginx.conf /usr/local/nginx 
(3).修改配置文件
upstream nacosserver{
    
server 139.155.49.250:8848;
server 119.91.99.85:8850;
server 119.91.99.85:8848;
}server {
    listen 8849;
server_name localhost;location /nacos/ {
    
proxy_pass http://nacosserver/nacos/;
}
(4).删除之前的临时容器,并重新启动一个新的容器
docker run -p 80:80 --net host --name nginx -v /usr/local/nginx/nginx.conf:/etc/nginx/nginx.conf --privileged=true -d nginx

三、Nacos服务注册中心

一.服务提供者

1、依赖

			<!-- SpringCloud Alibaba 微服务 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${
    spring-cloud-alibaba.version}</version><type>pom</type><scope>import</scope></dependency><!-- SpringCloud Ailibaba Nacos 服务注册中心 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!-- SpringCloud Ailibaba Nacos Config 服务配置中心 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency>

2、配置文件

server:port: 9001spring:application:name: nacos-payment-providercloud:nacos:discovery:server-addr: localhost:8848 #Nacos服务注册地址#端口暴漏
management:endpoints:web:exposure:include: '*'

3、主启动类

@EnableDiscoveryClient
@SpringBootApplication
public class CloudalibabaProviderPayment9001Application {
    public static void main(String[] args) {
    SpringApplication.run(CloudalibabaProviderPayment9001Application.class, args);System.out.println("启动成功");}
}

4、Controller

@RestController
public class PaymentController {
    @Value("${server.port}")private String serverPort;@GetMapping("/payment/nacos/{id}")public String getPayment(@PathVariable("id") Integer id){
    return "nacos registry,serverPort: "+ serverPort+"\t id"+id;}
}

二.服务消费者

1、依赖

完全相同

2、配置文件

也基本一致

server:port: 83spring:application:name: nacos-order-consumercloud:nacos:discovery:server-addr: localhost:8848#消费者将要去访问的微服务名称(成功注册进nacos的微服务提供者),在这配置了访问的服务,业务类就不用在定义常量了
service-url:nacos-user-service: http://nacos-payment-provider

3、主启动类

一致

@SpringBootApplication
@EnableDiscoveryClient
public class OrderNacosMain83 {
    public static void main(String[] args) {
    SpringApplication.run(OrderNacosMain83.class,args);}
}

4、Config加载Bean

@Configuration
public class ApplicationContextConfig {
    @Bean@LoadBalanced   //RestTemplate结合Ribbon做负载均衡一定要加@LoadBalancedpublic RestTemplate getRestTemplate(){
    return new RestTemplate();}
}

5、Controlle

@RestController
public class OrderNacosController {
    /*因为在yml中配置了service-url.nacos-user-service,这里不需要再定义要访问微服务名常量,而是通过boot直接读出来*/@Value("${service-url.nacos-user-service}")private String serverURL;@Resourceprivate RestTemplate restTemplate;@GetMapping("/consumer/payment/nacos/{id}")public String paymentInfo(@PathVariable("id") Long id){
    return restTemplate.getForObject(serverURL+"/payment/nacos/"+id,String.class);}
}

四、Nacos配置中心(自带动态刷新,比Euraka config强太多了)

一.依赖

                <!-- SpringCloud Ailibaba Nacos Config 服务配置中心 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency>

二.配置文件:Bootstrap

# Tomcat
server:port: 9201# Spring
spring: application:# 应用名称name: ruoyi-systemprofiles:# 环境配置active: devcloud:nacos:discovery:# 服务注册地址server-addr: 127.0.0.1:8848config:# 配置中心地址server-addr: 127.0.0.1:8848# 配置文件格式file-extension: yml# 共享配置shared-configs:- application-${
    spring.profiles.active}.${
    spring.cloud.nacos.config.file-extension}

三.添加自动刷新注解

@RestController
@RefreshScope   //SpringCloud原生注解 支持Nacos的动态刷新功能
public class ConfigClientController {
    @Value("${config.info}")private String configInfo;@GetMapping("/config/info")public String getConfigInfo(){
    return configInfo;}
}

四.Nacos配置文件匹配规则

prefix?{
    spring.profile.active}.${
    file-extension}

– prefix 默认为所属工程配置spring.application.name 的值(即:nacos-provider),也可以通过配置项 spring.cloud.nacos.config.prefix来配置。
– spring.profile.active 即为当前环境对应的 profile,详情可以参考 Spring Boot文档。 注意:当 spring.profile.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 p r e f i x . {prefix}.prefix.{file-extension}
– file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型。
总结:配置所属工程的spring.application.name的值 + “.” + properties/yml

在这里插入图片描述

  相关解决方案