
🏠个人主页:啊陈晓
🎉学习方向:java后端开发
🎁我的上一篇文章:【玩转Rabbitmq系列】02:Rabbitmq保姆级安装教程与基本消息模型实战
💕如果我的文章对你有帮助,点赞、收藏、留言都是对我最大的动力

【玩转Springcloud Alibaba系列】 Nacos 实现服务注册中心与负载均衡
现在让我们正式开启进入今天的正文
1.依样画葫芦创建跟上文中一样的服务提供模块cloudalibaba-provider-payment9002
最近正在学习SpringCloud Alibaba系列的内容, SpringCloud Alibaba是国产的微服务开发一站式解决方案,它与原有 Spring Cloud 兼容的同时对微服务生态进行扩展,通过添加少量的配置注解,便可实现更符合国情的微服务架构。
相比 Spring Cloud 官方标准,Spring Cloud Alibaba 提供了更完整的功能、更好用的API,目前 SpringCloud Alibaba 已经逐渐成为甚至已经成为了的国内的微服务技术标准,所以作为一名后端程序员,SpringCloud Alibaba是我们必须要了解和学习的一项技术。在接下俩的学习过程中,我会将我所学的知识和内容加以整理,通过文章的方式分享给大家,希望能给大家在SpringCloud Alibaba的学习上带来帮助!!
Nacos属于阿里巴巴的一个开源的项目,通过一组简单的特性集,Nacos能够帮助用户实现服务动态发现、服务配置、服务元数据及流量管理。nacos主要提供三种功能:服务注册与发现、动态配置服务、动态DNS服务。

简单来说,Nacos本质上是集成了动态配置服务、负载均衡、动态DNS服务的一个服务注册中心,那市面上服务注册中心技术这么多,像Eureka、Zookepper、Cosul都可以作为服务注册中心。那我们为什么要学习Nacos呢?
我们先来看看市面上各大服务注册中心的对比:
| 服务注册与发现框架 | CAP原则 | 控制台管理 | 社区活跃度 |
|---|---|---|---|
| Eureka | AP | 支持 | 低(2.x闭源) |
| Zookepper | CP | 不支持 | 中 |
| Cosul | CP | 支持 | 高 |
| Nacos | CP、AP | 支持 | 高 |
这里简单为大家说说表格中的CAP模型
CAP原则又称CAP定理,指的是在一个分布式系统中,一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)。CAP 原则指的是,这三个要素最多只能同时实现两点,不可能三者兼顾。
一致性(Consistency):同一时间看到的数据是一致的
可用性(Availability) :所有的请求都会得到响应
在CAP中,一致性和可用性只能满足其中一种。如表中所示,Eureka支持AP,Zookeeper和Consul支持CP,而Nacos中写明为CP、AP并不是表示Nacos能够同时满足CP和AP原则,而是相较于其他注册中心,Nacos能够在AP、CP两种模式中进行切换,根据不同的需求选择对应的模式。
除此之外,我们再来看看选择Nacos的其他原因:
- Eureaka2.x闭源
HashiCorp官宣,禁止其旗下Consul等软件在国内使用
相较于其他注册中心,zookpeer没有控制台管理
相较Eureka,nacos使用的raft协议,nacos集群的一致性要远大于eureka集群
nacos集成了动态配置和负载均衡等功能,功能更加强大
nacos背靠国内大厂,社区活跃度高
就目前来说,Nacos相较于其他注册中心有着不小的优势,使用nacos来实现服务注册是个非常不错的选择。
| 环境要求 |
|---|
| JDK8及更高版本 |
| Maven环境 |
官网直通车:https://nacos.io/zh-cn/
通过网址进入Nacos官网:
按下图中的步骤下载安装包


等待资源包下载完成,后将资源包解压,进入文件bin目录运行下面的命令
startup.cmd -m standalone出现如下图所示结果则证明安装成功


运行成功后我们访问: http://localhost:8848/nacos
默认账号密码都是nacos
出现下图所示结果则证明nacos环境搭建完成



在cloud2022项目中的pom.xml导入SpringCloud Alibaba依赖和一些常规依赖
-
- <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.0modelVersion>
-
- <groupId>com.canrioyuangroupId>
- <artifactId>cloud2022artifactId>
- <version>1.0-SNAPSHOTversion>
- <packaging>pompackaging>
-
-
-
-
- <properties>
- <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
- <maven.compiler.source>1.8maven.compiler.source>
- <maven.compiler.target>1.8maven.compiler.target>
- <junit.version>4.12junit.version>
- <log4j.version>1.2.17log4j.version>
- <lombok.version>1.18.24lombok.version>
- <mysql.version>8.0.21mysql.version>
- <druid.version>1.1.21druid.version>
- <mybatis-plus.spring.boot.version>3.5.1mybatis-plus.spring.boot.version>
- properties>
-
-
- <dependencyManagement>
-
- <dependencies>
-
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-dependenciesartifactId>
- <version>2.2.2.RELEASEversion>
- <type>pomtype>
- <scope>importscope>
- dependency>
-
- <dependency>
- <groupId>com.alibaba.cloudgroupId>
- <artifactId>spring-cloud-alibaba-dependenciesartifactId>
- <version>2.1.0.RELEASEversion>
- <type>pomtype>
- <scope>importscope>
- dependency>
-
- <dependency>
- <groupId>org.springframework.cloudgroupId>
- <artifactId>spring-cloud-dependenciesartifactId>
- <version>Hoxton.SR1version>
- <type>pomtype>
- <scope>importscope>
- dependency>
- <dependency>
- <groupId>mysqlgroupId>
- <artifactId>mysql-connector-javaartifactId>
- <version>${mysql.version}version>
- dependency>
- <dependency>
- <groupId>com.alibabagroupId>
- <artifactId>druid-spring-boot-starterartifactId>
- <version>${druid.version}version>
- dependency>
- <dependency>
- <groupId>com.baomidougroupId>
- <artifactId>mybatis-plus-boot-starterartifactId>
- <version>${mybatis-plus.spring.boot.version}version>
- dependency>
- <dependency>
- <groupId>junitgroupId>
- <artifactId>junitartifactId>
- <version>${junit.version}version>
- dependency>
- <dependency>
- <groupId>log4jgroupId>
- <artifactId>log4jartifactId>
- <version>${log4j.version}version>
- dependency>
- <dependency>
- <groupId>org.projectlombokgroupId>
- <artifactId>lombokartifactId>
- <version>${lombok.version}version>
- <optional>trueoptional>
- dependency>
-
- dependencies>
- dependencyManagement>
-
- <build>
- <plugins>
- <plugin>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-maven-pluginartifactId>
- <configuration>
- <fork>truefork>
- <addResources>trueaddResources>
- configuration>
- plugin>
- plugins>
- build>
-
- project>

- <dependencies>
-
- <dependency>
- <groupId>com.alibaba.cloudgroupId>
- <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
- dependency>
-
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-webartifactId>
- dependency>
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-actuatorartifactId>
- dependency>
-
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-devtoolsartifactId>
- <scope>runtimescope>
- <optional>trueoptional>
- dependency>
- <dependency>
- <groupId>org.projectlombokgroupId>
- <artifactId>lombokartifactId>
- <optional>trueoptional>
- dependency>
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-testartifactId>
- <scope>testscope>
- dependency>
- dependencies>
- server:
- port: 9001
-
- spring:
- application:
- name: nacos-payment-provider
- cloud:
- nacos:
- discovery:
- server-addr: localhost:8848 #配置Nacos地址
-
- #配置使用Actuator其他端点(除了info和health)
- management:
- endpoints:
- web:
- exposure:
- include: "*"
- import org.springframework.boot.SpringApplication;
- import org.springframework.boot.autoconfigure.SpringBootApplication;
- import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
-
- @SpringBootApplication
- @EnableDiscoveryClient //开启服务发现
- public class PaymentMain9001 {
- public static void main(String[] args) {
- SpringApplication.run(PaymentMain9001.class,args);
- }
- }
- 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 service,serverport:"+serverPort+"\t id:"+id;
- }
- }
访问:http://localhost:8848/nacos
可以发现在nacos控制台中的服务列表中已经出现了我们刚刚编写的Payment服务

访问:localhost:9001/payment/nacos/5
出现如下结果则成功

nacos底层集成了ribbon,因此ribbon能够很轻松的实现负载均衡,我们现在在上文的基础上做出演示。


-
- <dependencies>
-
- <dependency>
- <groupId>com.alibaba.cloudgroupId>
- <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
- dependency>
-
- <dependency>
- <groupId>com.canrioyuangroupId>
- <artifactId>cloud-api-commonsartifactId>
- <version>1.0-SNAPSHOTversion>
- dependency>
-
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-webartifactId>
- dependency>
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-actuatorartifactId>
- dependency>
-
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-devtoolsartifactId>
- <scope>runtimescope>
- <optional>trueoptional>
- dependency>
- <dependency>
- <groupId>org.projectlombokgroupId>
- <artifactId>lombokartifactId>
- <optional>trueoptional>
- dependency>
- <dependency>
- <groupId>org.springframework.bootgroupId>
- <artifactId>spring-boot-starter-testartifactId>
- <scope>testscope>
- dependency>
- dependencies>
- server:
- port: 83
-
-
- spring:
- application:
- name: nacos-order-consumer
- cloud:
- nacos:
- discovery:
- server-addr: localhost:8848
-
-
- #消费者将要去访问的微服务名称(注册成功进nacos的微服务提供者)
- service-url:
- nacos-user-service: http://nacos-payment-provider
- import org.springframework.boot.SpringApplication;
- import org.springframework.boot.autoconfigure.SpringBootApplication;
- import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
-
-
- @EnableDiscoveryClient //开启服务发现客户端
- @SpringBootApplication
- public class OrderNacosMain83 {
- public static void main(String[] args) {
- SpringApplication.run(OrderNacosMain83.class,args);
- }
- }
-
- 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;
-
- @Configuration
- public class ApplicationConfig {
- @Bean
- @LoadBalanced
- public RestTemplate getRestTemplate(){
- return new RestTemplate();
- }
- }
- package com.canrioyuan.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;
- import org.springframework.web.client.RestTemplate;
-
- import javax.annotation.Resource;
-
- /**
- * 消费者模块
- */
- @RestController
- public class OrderNacosController
- {
- @Resource
- private RestTemplate restTemplate;
-
- @Value("${service-url.nacos-user-service}")
- private String serverURL;
-
- @GetMapping("/consumer/payment/nacos/{id}")
- public String paymentInfo(@PathVariable("id") Long id)
- {
- return restTemplate.getForObject(serverURL+"/payment/nacos/"+id,String.class);
- }
-
- }
-
-
先启动: cloudalibaba-provider-payment9001
然后启动: cloudalibaba-provider-payment9002
最后启动: cloudalibaba-comsumer-nacos-order83
启动完成后,我们先访问 http://localhost:8848/nacos来看看nacos控制台中服务列表,可以看到有两台服务提供端、一台服务消费端。

然后我们访问:localhost:83/consumer/payment/nacos/5刷新,可以看到服务端口在有规律的变化,负载均衡实现成功


本文分享了SpringCloud Alibaba中的有关nacos实现服务注册和负载均衡的详细教学,在后期我将会分享更多有关SpringCloud Alibaba的相关内容,希望能给看完文章的你带来帮助!!
