一.下载nacos的压缩包并解压
进入如下bin目录
启动nacos
浏览器访问:
http://192.168.104.24:8848/nacos/index.html
成功访问:
将服务注册到nacos注册中心中:
- 加入springcloud阿里巴巴的依赖
-
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>cloud1103</groupId> <artifactId>cloud1103</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> <modules> <module>order-service</module> <module>user-service</module> <module>eureka-service</module> <module>swagger1103</module> </modules> <!--1.作为一个boot项目,需要一个指定父级--> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.9.RELEASE</version> <relativePath /> </parent> <!--3.版本信息控制--> <properties> <java.version>1.8</java.version> <spring-cloud.version>Hoxton.SR10</spring-cloud.version> <mysql.version>5.1.47</mysql.version> <mybatis.version>2.1.1</mybatis.version> <spring-cloud-alibaba.version>2.2.5.RELEASE</spring-cloud-alibaba.version> </properties> <!--2.cloud的依赖管理,并不是直接引入依赖--> <dependencyManagement> <dependencies> <!--springcloud--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> <!--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> <!--mysql--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.version}</version> </dependency> <!--mybatis--> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>${mybatis.version}</version> </dependency> </dependencies> </dependencyManagement> </project>
-
- 在两个子模块的服务当中注释掉eureka的依赖,加上nacos的依赖
-
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>cloud1103</artifactId> <groupId>cloud1103</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>user-service</artifactId> <properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--mysql,mybatis:父级我们已经进行了版本限定,所以我们在这里只需要引入,不需要指定版本--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> </dependency> <!--eureka客户端--> <!-- <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> <version>2.2.7.RELEASE</version> </dependency>--> <!--nacos客户端--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
-
- 在核心配置文件当中注掉eureka的服务,在生spring的层级下,加上nacos注册中心
-
server: port: 8083 spring: datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://192.168.8.171:3306/t_order?characterEncoding=utf8&useSSL=false username: root password: root application: name: orderservice # 服务名称 cloud: nacos: server-addr: http://localhost:8848 #autoconfigure: #exclude: org.springframework.cloud.netflix.eureka.EurekaClientAutoConfiguration mybatis: type-aliases-package: com.pro.domain configuration: map-underscore-to-camel-case: true log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 将user服务加进注册中心 #eureka: # client: # service-url: # defaultZone: http://127.0.0.1:10086/eureka
-
- 启动报错:
- 解决
- 然后我们现在启动两个服务,进入刚刚的注册中心客户端去观察是否已经加入到注册中心当中了
- 观察到两个服务实例都加入到注册中心了
二.两个集群多服务:
- 我们就可以看到现在是在默认的集群当中
- 那么我们在大型的项目当中肯定是需要将集群进行划分的,现在我们就集群划分,进行多服务
- 将user服务加入杭州这个集群,并且克隆一个服务8085,此时就可以看到杭州集群当中有两个用户服务的实例了
- 在开一台用户服务加入到上海集群,先在yml文件当中修改集群名称,端口号为8086
- 就可以发现,我们的用户服务,在上海集群当中也有一台实例在运行啦
- 类似的,我们把调用者,订单服务也划分到杭州集群当中
- 然后,我们观察用户服务实例之间是否负载均衡,我们通过调用订单服务,去观察订单服务中,去调用用户服务的时候,调用的是哪一个集群的哪个实例当中的服务:正常情况下,是不会调用上海集群当中的服务的,因为我们订单服务也是在杭州集群当中,但是我们用上面那种方式多开实例,一直测试不对劲,同样的也可以访问,然后我们就直接修改yml文件的端口号来创建多实例来测试,但是还是不对
- 最后发现负载均衡测试不成功,是因为在订单服务的启动类当中,没有指定是哪个集群下的服务负载均衡,因此他默认是所有的实例之间负载均衡,因此我们需要在订单服务的配置文件当中配置(优先同集群调用,需要设置)
-
#优先同集群调用,要设置 userservice: ribbon: NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule #定义负载均衡规则
-
通过测试,我们加上这个配置之后,就可以发现,上海的实例不会被调用服务了
-
跨集群调用成功
- 权重测试
- 经过测试,权重越小,服务被调用的越少
- 配置文件更新1
- 将两个服务的集群注掉,恢复默认,之前是为了讲解加上的
三.现在我们来对eureka和nacos进行对比
- 概念:
- 临时实例:用心跳来监测,向注册中心发信号,服务主动告知nacos自己是否健康
- 如果服务停止,注册中心当中就立马没有这个实例了
- 非临时实例:nacos主动询问服务是否健康存在
- 启动服务之后,再关闭服务,可以发现服务停止了,注册中心当中依然是有这个服务的(仍然可以看到),只不过不是健康的(健康的实例会减少)
- 如何设置为非临时实例:
- 临时实例:用心跳来监测,向注册中心发信号,服务主动告知nacos自己是否健康
- eureka,nacos两个注册中心对比:
- 相同点:
- 都是注册,拉取
- 都支持服务提供者用心跳方式做健康检查
- 不同点:
- nacos支持服务端主动检测提供者的状态,临时实例用心跳模式,非临时实例用主动检测
- 临时实例如果不正常心跳,会被踢掉,,非临时实例不会
- nacos支持服务列表变更时的消息推送模式
- 相同点: