• 【玩转Springcloud Alibaba系列】使用Nacos 实现服务注册与负载均衡


    🏠个人主页:啊陈晓

    🎉学习方向:java后端开发

    🎁我的上一篇文章:【玩转Rabbitmq系列】02:Rabbitmq保姆级安装教程与基本消息模型实战

    💕如果我的文章对你有帮助,点赞、收藏、留言都是对我最大的动力

    【玩转Springcloud Alibaba系列】文章直通车~ 

    【玩转Springcloud Alibaba系列】 Nacos 实现服务注册中心与负载均衡

     未完待续.........


    现在让我们正式开启进入今天的正文 

    文章目录

    前言

     一、什么是Nacos

    二.简单分析为什么我们要学习Nacos

    三.nacos安装

    1.环境准备

    2.安装包下载 

     四、服务注册实战

    1.先创建一个简单的springcloud父项目

     2.编写服务提供模块

    3.测试

     四、负载均衡实战

    1.依样画葫芦创建跟上文中一样的服务提供模块cloudalibaba-provider-payment9002

     2.创建消费者服务模块

    总结


    前言

    最近正在学习SpringCloud Alibaba系列的内容, SpringCloud Alibaba国产的微服务开发一站式解决方案它与原有 Spring Cloud 兼容的同时对微服务生态进行扩展,通过添加少量的配置注解,便可实现更符合国情的微服务架构。

    相比 Spring Cloud 官方标准,Spring Cloud Alibaba 提供了更完整的功能、更好用的API,目前 SpringCloud Alibaba 已经逐渐成为甚至已经成为了的国内的微服务技术标准,所以作为一名后端程序员,SpringCloud Alibaba是我们必须要了解和学习的一项技术。在接下俩的学习过程中,我会将我所学的知识和内容加以整理,通过文章的方式分享给大家,希望能给大家在SpringCloud Alibaba的学习上带来帮助!!


     一、什么是Nacos

    Nacos属于阿里巴巴的一个开源的项目,通过一组简单的特性集,Nacos能够帮助用户实现服务动态发现、服务配置、服务元数据及流量管理。nacos主要提供三种功能:服务注册与发现、动态配置服务、动态DNS服务。

    简单来说,Nacos本质上是集成了动态配置服务、负载均衡、动态DNS服务的一个服务注册中心,那市面上服务注册中心技术这么多,像Eureka、Zookepper、Cosul都可以作为服务注册中心。那我们为什么要学习Nacos呢?

    二.简单分析为什么我们要学习Nacos

    我们先来看看市面上各大服务注册中心的对比:

    各种注册中心
    服务注册与发现框架CAP原则控制台管理社区活跃度
    EurekaAP支持低(2.x闭源)
    ZookepperCP不支持
    CosulCP支持
    NacosCP、AP支持

    这里简单为大家说说表格中的CAP模型 

    CAP原则又称CAP定理,指的是在一个分布式系统中,一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)。CAP 原则指的是,这三个要素最多只能同时实现两点,不可能三者兼顾。

    一致性(Consistency):同一时间看到的数据是一致的

    可用性(Availability)   :所有的请求都会得到响应

      

    在CAP中,一致性可用性只能满足其中一种。如表中所示,Eureka支持APZookeeper和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来实现服务注册是个非常不错的选择。

    三.nacos安装

    1.环境准备

    环境要求
    JDK8及更高版本
    Maven环境

    2.安装包下载 

    官网直通车:https://nacos.io/zh-cn/

    通过网址进入Nacos官网:

    按下图中的步骤下载安装包

     等待资源包下载完成,后将资源包解压,进入文件bin目录运行下面的命令

    startup.cmd -m standalone

    出现如下图所示结果则证明安装成功

    运行成功后我们访问: http://localhost:8848/nacos

    默认账号密码都是nacos

    出现下图所示结果则证明nacos环境搭建完成

     

     四、服务注册实战

    1.先创建一个简单的springcloud父项目

    在cloud2022项目中的pom.xml导入SpringCloud Alibaba依赖和一些常规依赖

    1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    3. <modelVersion>4.0.0modelVersion>
    4. <groupId>com.canrioyuangroupId>
    5. <artifactId>cloud2022artifactId>
    6. <version>1.0-SNAPSHOTversion>
    7. <packaging>pompackaging>
    8. <properties>
    9. <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
    10. <maven.compiler.source>1.8maven.compiler.source>
    11. <maven.compiler.target>1.8maven.compiler.target>
    12. <junit.version>4.12junit.version>
    13. <log4j.version>1.2.17log4j.version>
    14. <lombok.version>1.18.24lombok.version>
    15. <mysql.version>8.0.21mysql.version>
    16. <druid.version>1.1.21druid.version>
    17. <mybatis-plus.spring.boot.version>3.5.1mybatis-plus.spring.boot.version>
    18. properties>
    19. <dependencyManagement>
    20. <dependencies>
    21. <dependency>
    22. <groupId>org.springframework.bootgroupId>
    23. <artifactId>spring-boot-dependenciesartifactId>
    24. <version>2.2.2.RELEASEversion>
    25. <type>pomtype>
    26. <scope>importscope>
    27. dependency>
    28. <dependency>
    29. <groupId>com.alibaba.cloudgroupId>
    30. <artifactId>spring-cloud-alibaba-dependenciesartifactId>
    31. <version>2.1.0.RELEASEversion>
    32. <type>pomtype>
    33. <scope>importscope>
    34. dependency>
    35. <dependency>
    36. <groupId>org.springframework.cloudgroupId>
    37. <artifactId>spring-cloud-dependenciesartifactId>
    38. <version>Hoxton.SR1version>
    39. <type>pomtype>
    40. <scope>importscope>
    41. dependency>
    42. <dependency>
    43. <groupId>mysqlgroupId>
    44. <artifactId>mysql-connector-javaartifactId>
    45. <version>${mysql.version}version>
    46. dependency>
    47. <dependency>
    48. <groupId>com.alibabagroupId>
    49. <artifactId>druid-spring-boot-starterartifactId>
    50. <version>${druid.version}version>
    51. dependency>
    52. <dependency>
    53. <groupId>com.baomidougroupId>
    54. <artifactId>mybatis-plus-boot-starterartifactId>
    55. <version>${mybatis-plus.spring.boot.version}version>
    56. dependency>
    57. <dependency>
    58. <groupId>junitgroupId>
    59. <artifactId>junitartifactId>
    60. <version>${junit.version}version>
    61. dependency>
    62. <dependency>
    63. <groupId>log4jgroupId>
    64. <artifactId>log4jartifactId>
    65. <version>${log4j.version}version>
    66. dependency>
    67. <dependency>
    68. <groupId>org.projectlombokgroupId>
    69. <artifactId>lombokartifactId>
    70. <version>${lombok.version}version>
    71. <optional>trueoptional>
    72. dependency>
    73. dependencies>
    74. dependencyManagement>
    75. <build>
    76. <plugins>
    77. <plugin>
    78. <groupId>org.springframework.bootgroupId>
    79. <artifactId>spring-boot-maven-pluginartifactId>
    80. <configuration>
    81. <fork>truefork>
    82. <addResources>trueaddResources>
    83. configuration>
    84. plugin>
    85. plugins>
    86. build>
    87. project>

     2.编写服务提供模块

    1.在cloud2022下创建一个Maven项目cloudalibaba-provider-payment9001作为服务提供者

     2.在pom.xml文件中添加nacos相关依赖和一些常规依赖

    1. <dependencies>
    2. <dependency>
    3. <groupId>com.alibaba.cloudgroupId>
    4. <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
    5. dependency>
    6. <dependency>
    7. <groupId>org.springframework.bootgroupId>
    8. <artifactId>spring-boot-starter-webartifactId>
    9. dependency>
    10. <dependency>
    11. <groupId>org.springframework.bootgroupId>
    12. <artifactId>spring-boot-starter-actuatorartifactId>
    13. dependency>
    14. <dependency>
    15. <groupId>org.springframework.bootgroupId>
    16. <artifactId>spring-boot-devtoolsartifactId>
    17. <scope>runtimescope>
    18. <optional>trueoptional>
    19. dependency>
    20. <dependency>
    21. <groupId>org.projectlombokgroupId>
    22. <artifactId>lombokartifactId>
    23. <optional>trueoptional>
    24. dependency>
    25. <dependency>
    26. <groupId>org.springframework.bootgroupId>
    27. <artifactId>spring-boot-starter-testartifactId>
    28. <scope>testscope>
    29. dependency>
    30. dependencies>

      3.添加并修改application.yaml

    1. server:
    2. port: 9001
    3. spring:
    4. application:
    5. name: nacos-payment-provider
    6. cloud:
    7. nacos:
    8. discovery:
    9. server-addr: localhost:8848 #配置Nacos地址
    10. #配置使用Actuator其他端点(除了info和health)
    11. management:
    12. endpoints:
    13. web:
    14. exposure:
    15. include: "*"

    4.编写主启动类PaymentMain9001

    1. import org.springframework.boot.SpringApplication;
    2. import org.springframework.boot.autoconfigure.SpringBootApplication;
    3. import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    4. @SpringBootApplication
    5. @EnableDiscoveryClient //开启服务发现
    6. public class PaymentMain9001 {
    7. public static void main(String[] args) {
    8. SpringApplication.run(PaymentMain9001.class,args);
    9. }
    10. }

     5.编写PaymentController

    1. import org.springframework.beans.factory.annotation.Value;
    2. import org.springframework.web.bind.annotation.GetMapping;
    3. import org.springframework.web.bind.annotation.PathVariable;
    4. import org.springframework.web.bind.annotation.RestController;
    5. @RestController
    6. public class PaymentController {
    7. @Value("${server.port}")
    8. private String serverPort;
    9. @GetMapping(value="/payment/nacos/{id}")
    10. public String getPayment(@PathVariable("id") Integer id){
    11. return "nacos service,serverport:"+serverPort+"\t id:"+id;
    12. }
    13. }

    3.测试

    访问:http://localhost:8848/nacos

    可以发现在nacos控制台中的服务列表中已经出现了我们刚刚编写的Payment服务

    访问:localhost:9001/payment/nacos/5

    出现如下结果则成功

    至此,nacos实现服务注册成功!!

     四、负载均衡实战

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

    1.依样画葫芦创建跟上文中一样的服务提供模块cloudalibaba-provider-payment9002

     2.创建消费者服务模块

    1.在cloud2022下创建一个Maven项目cloudalibaba-comsumer-nacos-order83作为服务提供者

     2.pom.xml文件中添加nacos相关依赖和一些常规依赖

    1. <dependencies>
    2. <dependency>
    3. <groupId>com.alibaba.cloudgroupId>
    4. <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
    5. dependency>
    6. <dependency>
    7. <groupId>com.canrioyuangroupId>
    8. <artifactId>cloud-api-commonsartifactId>
    9. <version>1.0-SNAPSHOTversion>
    10. dependency>
    11. <dependency>
    12. <groupId>org.springframework.bootgroupId>
    13. <artifactId>spring-boot-starter-webartifactId>
    14. dependency>
    15. <dependency>
    16. <groupId>org.springframework.bootgroupId>
    17. <artifactId>spring-boot-starter-actuatorartifactId>
    18. dependency>
    19. <dependency>
    20. <groupId>org.springframework.bootgroupId>
    21. <artifactId>spring-boot-devtoolsartifactId>
    22. <scope>runtimescope>
    23. <optional>trueoptional>
    24. dependency>
    25. <dependency>
    26. <groupId>org.projectlombokgroupId>
    27. <artifactId>lombokartifactId>
    28. <optional>trueoptional>
    29. dependency>
    30. <dependency>
    31. <groupId>org.springframework.bootgroupId>
    32. <artifactId>spring-boot-starter-testartifactId>
    33. <scope>testscope>
    34. dependency>
    35. dependencies>

    3. 添加并修改application.yaml

    1. server:
    2. port: 83
    3. spring:
    4. application:
    5. name: nacos-order-consumer
    6. cloud:
    7. nacos:
    8. discovery:
    9. server-addr: localhost:8848
    10. #消费者将要去访问的微服务名称(注册成功进nacos的微服务提供者)
    11. service-url:
    12. nacos-user-service: http://nacos-payment-provider

    4.编写主启动类OrderNacosMain83

    1. import org.springframework.boot.SpringApplication;
    2. import org.springframework.boot.autoconfigure.SpringBootApplication;
    3. import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    4. @EnableDiscoveryClient //开启服务发现客户端
    5. @SpringBootApplication
    6. public class OrderNacosMain83 {
    7. public static void main(String[] args) {
    8. SpringApplication.run(OrderNacosMain83.class,args);
    9. }
    10. }

    5.编写配置类为容器注入用于访问Rest请求的RestTemplate 

    1. import org.springframework.cloud.client.loadbalancer.LoadBalanced;
    2. import org.springframework.context.annotation.Bean;
    3. import org.springframework.context.annotation.Configuration;
    4. import org.springframework.web.client.RestTemplate;
    5. @Configuration
    6. public class ApplicationConfig {
    7. @Bean
    8. @LoadBalanced
    9. public RestTemplate getRestTemplate(){
    10. return new RestTemplate();
    11. }
    12. }

    6.编写业务类OrderNacosController

    1. package com.canrioyuan.controller;
    2. import org.springframework.beans.factory.annotation.Value;
    3. import org.springframework.web.bind.annotation.GetMapping;
    4. import org.springframework.web.bind.annotation.PathVariable;
    5. import org.springframework.web.bind.annotation.RestController;
    6. import org.springframework.web.client.RestTemplate;
    7. import javax.annotation.Resource;
    8. /**
    9. * 消费者模块
    10. */
    11. @RestController
    12. public class OrderNacosController
    13. {
    14. @Resource
    15. private RestTemplate restTemplate;
    16. @Value("${service-url.nacos-user-service}")
    17. private String serverURL;
    18. @GetMapping("/consumer/payment/nacos/{id}")
    19. public String paymentInfo(@PathVariable("id") Long id)
    20. {
    21. return restTemplate.getForObject(serverURL+"/payment/nacos/"+id,String.class);
    22. }
    23. }

    7.测试

    先启动:     cloudalibaba-provider-payment9001

    然后启动:  cloudalibaba-provider-payment9002

    最后启动:  cloudalibaba-comsumer-nacos-order83

    启动完成后,我们先访问 http://localhost:8848/nacos来看看nacos控制台中服务列表,可以看到有两台服务提供端、一台服务消费端。

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

     

    至此,nacos实现负载均衡成功!!


    总结

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

    至此,我们今天的教程就到此结束啦~

    感谢您的阅读,希望我的文章能给你带来帮助!!!


  • 相关阅读:
    RabbitMQ 学习(四)-- 发布确认模式
    Phoenix创建Hbase二级索引_尚硅谷大数据培训
    java毕业设计车辆监管系统mybatis+源码+调试部署+系统+数据库+lw
    【Pytest接口自动化Case失败如何下线】
    CANoe-激活总线状态、CAPL导航器不显示Test Case视图
    利用在线培训系统提升员工技能,助力企业发展
    红杉官网已删长文:伴随SBF一路走来的救世主情结(上)
    java多线程新
    什么是分布式软件系统
    [附源码]JAVA毕业设计客户台账管理(系统+LW)
  • 原文地址:https://blog.csdn.net/weixin_47025166/article/details/125988993