SpringCloudAlibaba服务注册与发现
Nacos就是注册中心 + 配置中心的组合
Nacos=Eureka + Config + Bus
安装并运行nacos
先从官网下载Nacos
https://github.com/alibaba/nacos/releases/tag/1.1.4
推荐百度云下载,github下载太慢了,提取码rest
https://pan.baidu.com/share/init?surl=186nmlqPGows9gUZKAx8Zw解压安装包,直接运行bin目录下的cmd startup.cmd
linux版本:sh startup.sh
命令运行成功后直接访问http://localhost:8848/nacos
默认账户密码都是nacos
Nacos作为服务注册中心演示
先创建maven父子项目
1.先创建一个maven父项目,删除src的代码部分,然后修改pom文件
<packaging>pom</packaging>这个要牢记
<?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>com.atguigu.springcloud</groupId> <artifactId>cloud2020</artifactId> <version>1.0-SNAPSHOT</version> <packaging>pom</packaging> <modules> <module>cloudalibaba-provider-payment9002</module> </modules> <!-- 统一管理jar包版本 --> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <junit.version>4.12</junit.version> <log4j.version>1.2.17</log4j.version> <lombok.version>1.16.18</lombok.version> <mysql.version>5.1.47</mysql.version> <druid.version>1.1.16</druid.version> <mybatis.spring.boot.version>1.3.0</mybatis.spring.boot.version> </properties> <!-- 子模块继承之后,提供作用:锁定版本+子modlue不用写groupId和version --> <dependencyManagement> <dependencies> <!--spring boot 2.2.2--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.2.2.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> <!--spring cloud Hoxton.SR1--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Hoxton.SR1</version> <type>pom</type> <scope>import</scope> </dependency> <!--spring cloud alibaba 2.1.0.RELEASE--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.1.0.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> <!--<dependency>--> <!--<groupId>mysql</groupId>--> <!--<artifactId>mysql-connector-java</artifactId>--> <!--<version>${mysql.version}</version>--> <!--</dependency>--> <!--<dependency>--> <!--<groupId>com.alibaba</groupId>--> <!--<artifactId>druid</artifactId>--> <!--<version>${druid.version}</version>--> <!--</dependency>--> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>${mybatis.spring.boot.version}</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>${log4j.version}</version> </dependency> <!--<dependency>--> <!--<groupId>org.projectlombok</groupId>--> <!--<artifactId>lombok</artifactId>--> <!--<version>${lombok.version}</version>--> <!--<optional>true</optional>--> <!--</dependency>--> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <fork>true</fork> <addResources>true</addResources> </configuration> </plugin> </plugins> </build> </project>
创建基于Nacos的服务提供者
新建Module
cloudalibaba-provider-payment9001
POM
本模块POM<?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>cloud2020</artifactId> <groupId>com.atguigu.springcloud</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>cloudalibaba-provider-payment9002</artifactId> <dependencies> <!--SpringCloud ailibaba nacos --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!-- SpringBoot整合Web组件 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!--日常通用jar包配置--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> </project>
<!--SpringCloud ailibaba nacos nacos无论是服务注册方还是服务提供方都依赖这个包--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
YMLserver: port: 9001 spring: application: name: nacos-payment-provider cloud: nacos: discovery: server-addr: 192.168.1.10:8848 #配置Nacos地址 #server-addr: 192.168.1.10:1111 #使用nginx负载均衡注册服务,1111是nginx设置的监听端口号 management: endpoints: web: exposure: include: '*'
主启动package com.atguigu.springcloud.providerpayment9001; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; /** * */ @SpringBootApplication @EnableDiscoveryClient public class CloudalibabaProviderPayment9001Application { public static void main(String[] args) { SpringApplication.run(CloudalibabaProviderPayment9001Application.class, args); } }
@EnableDiscoveryClient 表示这个项目是一个nacos客户端
业务类package com.atguigu.springcloud.providerpayment9001.controller; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; @RestController public class PaymentController { @Value("${server.port}") private String serverPort; @GetMapping(value = "/payment/nacos/{id}") public String getPayment(@PathVariable("id") Integer id) { return "nacos registry, serverPort: "+ serverPort+"\t id"+id; } }
测试
http://localhost:9001/payment/nacos/31
nacos控制台
nacos服务注册中心+服务提供者9001都ok了
为了下一章节演示Nacos的负载均衡,参照9001新建9002
这里如果名字取错了还暴力删除导致创建的工程没有source标志的,那是因为父工程的.idea文件没有更新,记得关掉项目删除.idea,再重新导入项目即可cloudalibaba-provider-payment9002
取巧的方法是,直接拷贝虚拟端口映射
基于Nacos的服务消费者
新建Module
cloudalibaba-consumer-nacos-order83
POM<?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>cloud2020</artifactId> <groupId>com.atguigu.springcloud</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>cloudalibaba-consumer-nacos-order83</artifactId> <dependencies> <!--SpringCloud ailibaba nacos --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!-- 引入自己定义的api通用包,可以使用Payment支付Entity --> <!--<dependency>--> <!--<groupId>com.atguigu.springcloud</groupId>--> <!--<artifactId>cloud-api-commons</artifactId>--> <!--<version>${project.version}</version>--> <!--</dependency>--> <!-- SpringBoot整合Web组件 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!--日常通用jar包配置--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> </project>
为什么nacos支持负载均衡
nacos内置了ribbon
YML消费者也会把自己注册进nacos
server: port: 83 spring: application: name: nacos-order-consumer cloud: nacos: discovery: server-addr: 192.168.1.10:8848 #消费者将要去访问的微服务名称(注册成功进nacos的微服务提供者) service-url: nacos-user-service: http://nacos-payment-provider
主启动类
package com.atguigu.springcloud.consumernacosorder83; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; /** * nacos整合了ribbon天生具有负载均衡功能 */ @EnableDiscoveryClient @SpringBootApplication public class CloudalibabaConsumerNacosOrder83Application { public static void main(String[] args) { SpringApplication.run(CloudalibabaConsumerNacosOrder83Application.class, args); } }
业务类
ApplicationContextConfigpackage com.atguigu.springcloud.consumernacosorder83.config; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate; /** * RestTemplate如果访问集群服务器必须加上@LoadBalanced要不然不知道该访问哪一个服务器而报错 */ @Configuration public class ApplicationContextConfig { // @Bean // @LoadBalanced // public RestTemplate getRestTemplate() // { // return new RestTemplate(); // } @Bean @LoadBalanced public RestTemplate getRestTemplate(){ return new RestTemplate(); } }
OrderNacosController
package com.atguigu.springcloud.consumernacosorder83.controller; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; import javax.annotation.Resource; @RestController @Slf4j public class OrderNacosController { @Resource private RestTemplate restTemplate; @Value("${service-url.nacos-user-service}") private String serverURL; @GetMapping(value = "/consumer/payment/nacos/{id}") public String paymentInfo(@PathVariable("id") Long id) { //return restTemplate.getForObject(serverURL+"/payment/nacos/"+id,String.class); return restTemplate.getForObject(serverURL+"/payment/nacos/"+id,String.class); } }
测试
http://localhost:83/consumer/payment/nacos/31
服务注册中心对比
各种注册中心对比
Nacos和CAP
切换
Nacos支持AP和CP模式的切换
推荐阅读
-
详解Spring Cloud Consul 实现服务注册和发现
-
Spring-cloud 服务发现与消费(以ribbon为例)
-
SpringCloud之服务注册与发现Spring Cloud Eureka实例代码
-
ASP.NET Core依赖注入系列教程之服务的注册与提供
-
1、微服务--为什么有consul,consul注册,心跳检测,服务发现
-
服务注册和发现(Consul)
-
springcloud使用之服务的注册发现与消费
-
基于 Consul 实现 MagicOnion(GRpc) 服务注册与发现
-
Eureka(服务注册与发现)简单入门
-
Windows环境下实现Consul服务注册和服务发现