相关推荐recommended
【Spring Cloud Alibaba】(一)微服务介绍 及 Nacos注册中心实战
作者:mmseoamin日期:2024-02-06

【Spring Cloud Alibaba】(一)微服务介绍 及 Nacos注册中心实战,CSDN成就一亿技术人,第1张

文章目录

  • 前言
  • I、微服务与Spring Cloud
  • II、Nacos 注册中心
  • III、Spring Cloud Alibaba Nacos 实战
    • 1、新建父工程
    • 2、新建demo-a 服务
    • 3、新建 demo-b 服务
    • 4、实现服务调用:传统方式
    • 5、实现服务调用:Nacos+Ribbon方式
    • 总结
    • 最后

      前言

      Spring Cloud Alibaba微服务组件,是市面上是比较主流的微服务组件,同时有着阿里巴巴官方认证,因此可以称的上是国内最强的微服务框架,没有之一。本文作为Spring Cloud Alibaba微服务系列的实战开篇,主要内容如下:

      • 介绍我对于微服务、Spring Cloud、Spring Cloud Netflix、Spring Cloud Alibaba 的理解;
      • 介绍注册中心和Nacos,并安装Nacos作为注册中心,用于实现服务注册和服务发现;
      • 从零开始使用Spring Cloud Alibaba进行环境搭建,源码实战:创建2个微服务,注册到Nacos,并实现服务之间通过Ribbon的负载均衡调用

        如果你没有用过Spring Cloud Alibaba,或者没有亲手从零搭建过环境,那么本篇非常适合你入门Spring Cloud Alibaba。


        I、微服务与Spring Cloud

        微服务、Spring Cloud、Spring Cloud Netflix 和 Spring Cloud Alibaba,你知道它们之间的关系吗?

        作为Spring Cloud Alibaba微服务系列的实战开篇,我觉得有必要对齐一下对于这几个概念的理解,纯讲概念可能比较枯燥,所以咱们不写官方的概念,以下输出仅是我的理解,欢迎共同探讨!

        • 微服务

          我们通常讲的微服务,就是指的微服务架构,是一种架构风格,也是一种思想,简单来说:就是按业务边界,将应用更细粒度的拆分为多个小的服务,每个服务独立部署,服务之间直接调用。方便针对不同业务进行不同的水平扩展,避免业务捆绑在一起部署造成服务器资源部署的浪费。它和SOA架构的主要区别是去中心化,比较经典的图例:

          【Spring Cloud Alibaba】(一)微服务介绍 及 Nacos注册中心实战,SOA与微服务架构对比,第2张

        • Spring Cloud

          在微服务中,我们将业务拆分成一个个小的服务,那么业务之间的相互调用,就需要跨服务远程调用,调用链路可能错综复杂,就像蜘蛛网一样,这就引出如何实现服务治理、链路跟踪等等一系列功能,Spring Cloud正是以微服务为核心的整体解决方案的一套标准。当然,微服务不止有Spring Cloud!

        • Spring Cloud Netflix

          Spring Cloud有很多第三方的实现,Spring Cloud Netflix是其中实现的比较早,也比较完整的一套,所以用的项目也比较多,由于比较深入人心,所以在早期人们往往把Netflix叫做Spring Cloud,把Spring Cloud也叫做Netflix。但后面由于Spring Cloud Netflix的组件停更进入维护模式,迫使Spring Cloud后续也在移除Netflix相关组件,所以目前Spring Cloud Alibaba 逐渐代替它成为主流的微服务框架。

        • Spring Cloud Alibaba

          Spring Cloud Alibaba 是阿里巴巴提供的微服务开发一站式解决方案,是阿里巴巴开源中间件与 Spring Cloud 体系的融合,它包含开发分布式应用程序所需的所有组件,使您可以轻松地使用Spring Cloud开发应用程序。比早期的Netflix提供了更丰富、更强大的微服务组件。Spring Cloud Alibaba 和其它的实现如 Netflix, Consul,Zookeeper 等的对比如下图:

          【Spring Cloud Alibaba】(一)微服务介绍 及 Nacos注册中心实战,Spring Cloud Alibaba 和其它的实现如 Netflix, Consul,Zookeeper 等的对比,第3张


          II、Nacos 注册中心

          微服务是去中心化的,为什么还有注册中心?

          如果你还没有真正理解微服务和注册中心,那么这个问题多半会懵🤔

          实际上,这个去中心化,是指服务与服务之间的调用是去中心化的调用,也就是点对点的调用。而注册中心正是为了实现去中心化调用起到了的至关重要的作用,用于服务注册和服务发现,这样通过注册中心,各个服务之间就可以相互发现,就为去中心化的调用提供了必备条件。

          • 服务注册:向注册中心注册服务。
          • 服务发现:服务注册或下线后,都可以被注册中心的其它服务自动发现。

            【Spring Cloud Alibaba】(一)微服务介绍 及 Nacos注册中心实战,服务注册与发现,第4张

            对于注册中心,常见的有Nacos、Zookeeper、Eureka、Consul等。对于Spring Cloud Alibaba来说,Nacos是首选,因为它是Spring Cloud Alibaba微服务组件中标配的注册中心,也是阿里开源的非常重要的微服务组件,不止可以做注册中心,也可以做配置中心,本文只用它来做注册中心。

            对于选择Nacos作为注册中心,我们需要单独安装Nacos-server,可以部署到Windows/Linux/Unix/Mac,有单机模式和集群模式,本文仅演示Window单机模式部署,关于其它系统和集群模式安装,请参考官方部署文档: https://nacos.io/zh-cn/docs/deployment.html

            下载地址:https://github.com/alibaba/nacos/tags?after=2.0.4

            【Spring Cloud Alibaba】(一)微服务介绍 及 Nacos注册中心实战,Nacos压缩包下载列表,第5张

            我下载的是 nacos-server-1.4.2.zip,下载直接解压运行即可,解压后:

            【Spring Cloud Alibaba】(一)微服务介绍 及 Nacos注册中心实战,nacos-server解压后,第6张

            进入bin目录,打开cmd,执行以下命令启动:

            startup.cmd -m standalone
            

            【Spring Cloud Alibaba】(一)微服务介绍 及 Nacos注册中心实战,cmd启动nacos,第7张

            启动成功,访问Nacos控制台:http://localhost:8848/nacos/index.html

            用户名:nacos

            密码:nacos

            【Spring Cloud Alibaba】(一)微服务介绍 及 Nacos注册中心实战,nacos1.4.2控制台界面,第8张

            至此,Window单机模式的Nacos注册中心就安装完成并能正常启动了,非常简单易上手,接下来,让咱们来连接Nacos注册中心开始源码实战吧!


            III、Spring Cloud Alibaba Nacos 实战

            使用Spring Cloud Alibaba Nacos 实战,具体实现功能 如下:

            • 创建2个SpringBoot程序服务,并能注册到Nacos;
            • 实现服务之间调用,使用Ribbon做负载均衡

              关于Spring Cloud Alibaba版本选型:

              • 官方的版本说明

                【Spring Cloud Alibaba】(一)微服务介绍 及 Nacos注册中心实战,Spring Cloud Alibaba版本说明,第9张

              • 我们的选择版本
                Spring Cloud Alibaba VersionSpring Cloud VersionSpring Boot VersionNacos Version
                2.2.7.RELEASEHoxton.SR122.3.12.RELEASE1.4.2
                • 最终工程结构

                  在创建服务之前,我们先预览一下全貌,如下图:

                  【Spring Cloud Alibaba】(一)微服务介绍 及 Nacos注册中心实战,在这里插入图片描述,第10张

                  1、新建父工程

                  父工程只有一个pom.xml文件,主要目的是引入BOM,定义好版本,服务不必关心版本号,pom.xml的dependencyManagement配置如下:

                  
                      8
                      8
                      2.3.12.RELEASE
                      Hoxton.SR12
                      2.2.7.RELEASE
                      5.2.21.RELEASE
                      2.7.18
                  
                  
                      
                          
                          
                              org.springframework
                              spring-framework-bom
                              ${spring.version}
                              pom
                              import
                          
                          
                          
                              org.apache.dubbo
                              dubbo-dependencies-bom
                              ${dubbo.version}
                              pom
                              import
                          
                          
                          
                              com.alibaba.cloud
                              spring-cloud-alibaba-dependencies
                              ${spring-cloud-alibaba.version}
                              pom
                              import
                          
                          
                          
                              org.springframework.boot
                              spring-boot-dependencies
                              ${spring-boot.version}
                              pom
                              import
                          
                          
                          
                              org.springframework.cloud
                              spring-cloud-dependencies
                              ${spring-cloud.version}
                              pom
                              import
                          
                          
                      
                  
                  

                  2、新建demo-a 服务

                  Spring Cloud的每个服务,实际上就是一个简单的Spring Boot程序,下面演示创建SpringBoot程序服务demo-a,并可以注册到Nacos。

                  • pom.xml

                    在SpringBoot程序基础上,重点额外增加依赖:spring-cloud-starter-alibaba-nacos-discovery用于Nacos服务发现,版本随父工程,所以不用定义。

                    
                        
                            org.springframework.boot
                            spring-boot-starter-web
                        
                        
                        
                            com.alibaba.cloud
                            spring-cloud-starter-alibaba-nacos-discovery
                        
                    
                    
                  • application.properties

                    spring.application.name: 配置服务名

                    spring.cloud.nacos.discovery.server-addr:配置Nacos-server地址

                     server.port=8080
                     spring.application.name=demo-a
                     spring.cloud.nacos.discovery.server-addr=localhost:8848
                    

                    如果不想使用 Nacos 作为您的服务注册与发现,可以将 spring.cloud.nacos.discovery.enabled 设置为 false。

                    更多关于 spring-cloud-starter-alibaba-nacos-discovery 的 starter 配置项: https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-discovery

                    • 启动类 DemoARunner

                      额外增加注解@EnableDiscoveryClient

                      @SpringBootApplication
                      @EnableDiscoveryClient
                      public class DemoARunner {
                          public static void main(String[] args) {
                              SpringApplication.run(DemoARunner.class, args);
                          }
                      }
                      
                      • 控制器类 DemoAController

                        这里增加一个简单的 /hello API

                        @RestController
                        @RequestMapping("/a")
                        public class DemoAController {
                            @GetMapping("/hello")
                            public String hello(@RequestParam("name") String name) {
                                return "hello:" + name;
                            }
                        }
                        
                        • 启动demo-a服务

                          可以看到启动成功,并注册到nacos

                          【Spring Cloud Alibaba】(一)微服务介绍 及 Nacos注册中心实战,demo-a启动成功并注册到nacos,第11张

                        • 通过Nacos 控制台查看注册结果

                          【Spring Cloud Alibaba】(一)微服务介绍 及 Nacos注册中心实战,nacos查看服务列表,第12张

                        • 通过Nacos Open API查看注册结果

                          API地址:http://localhost:8848/nacos/v1/ns/instance/list?serviceName=demo-a

                          【Spring Cloud Alibaba】(一)微服务介绍 及 Nacos注册中心实战,nacos open API查看服务注册结果,第13张

                          3、新建 demo-b 服务

                          微服务框架,肯定不能只有一个服务,参考demo-a 同样的步骤,再创建一个demo-b:

                          • pom.xml

                            与demo-a的依赖相同

                          • application.properties

                            server.port=8081
                            spring.application.name=demo-b
                            spring.cloud.nacos.discovery.server-addr=localhost:8848
                            
                          • 启动类 DemoBRunner

                            @SpringBootApplication
                            @EnableDiscoveryClient
                            public class DemoBRunner {
                                public static void main(String[] args) {
                                    SpringApplication.run(DemoBRunner.class, args);
                                }
                            }
                            
                            • 控制器类 DemoBController

                              这里增加一个简单的 /world API

                              @RestController
                              @RequestMapping("/b")
                              public class DemoBController {
                                  @GetMapping("/world")
                                  public String world(@RequestParam("name") String name) {
                                      return "world:" + name;
                                  }
                              }
                              
                              • 启动demo-b服务,查看注册结果

                                【Spring Cloud Alibaba】(一)微服务介绍 及 Nacos注册中心实战,在这里插入图片描述,第14张


                                4、实现服务调用:传统方式

                                先来看看如果没有注册中心,我们传统的调用方式:RestTemplate指定ip调用,a调用b

                                @Configuration
                                public class RestTemplateConfig {
                                    @Bean
                                    public RestTemplate restTemplate() {
                                        return new RestTemplate();
                                    }
                                }
                                

                                在DemoAController中注入RestTemplate 并实现a调用b:

                                @RestController
                                @RequestMapping("/a")
                                public class DemoAController {
                                    @Autowired
                                    private RestTemplate restTemplate;
                                    @GetMapping("/callB1")
                                    public String callB1(@RequestParam("name") String name) {
                                        String url = "http://localhost:8081/b/world?name=" + name;
                                        return restTemplate.exchange(url, HttpMethod.GET, null, String.class).getBody();
                                    }
                                }
                                

                                测试OK,如下图:

                                【Spring Cloud Alibaba】(一)微服务介绍 及 Nacos注册中心实战,在这里插入图片描述,第15张

                                5、实现服务调用:Nacos+Ribbon方式

                                再来看看,Nacos通过Ribbon负载均衡的调用方式:

                                • RestTemplate和LoadBalanceClient的调用方式

                                  因为spring-cloud-starter-alibaba-nacos-discovery默认集成的Ribbon,Spring Cloud Ribbon是基于Netflix Ribbon 实现的一套客户端的负载均衡工具,所以这里的LoadBalancerClient的实现类是RibbonLoadBalancerClient,由Ribbon实现对RestTemplate的负载均衡。

                                  @RestController
                                  @RequestMapping("/a")
                                  public class DemoAController {
                                      @Autowired
                                      private LoadBalancerClient loadBalancerClient;
                                      @Autowired
                                      private RestTemplate restTemplate;
                                      @GetMapping("/callB2")
                                      public String callB2(@RequestParam("name") String name) {
                                          ServiceInstance serviceInstance = loadBalancerClient.choose("demo-b");
                                          String url = String.format("http://%s:%s/b/world?name=%s", serviceInstance.getHost(), serviceInstance.getPort(), name);
                                          return restTemplate.exchange(url, HttpMethod.GET, null, String.class).getBody();
                                      }
                                  }
                                  

                                  测试OK,如下图:

                                  【Spring Cloud Alibaba】(一)微服务介绍 及 Nacos注册中心实战,在这里插入图片描述,第16张

                                  这样就实现了按服务名的负载均衡调用,当我们启动多个demo-b服务的话,也可以对Ribbon配置不同的负载均衡策略,内容较多具体不再详述。

                                  • RestTemplate添加@LoadBalanced 注解的调用方式
                                    @Configuration
                                    public class RestTemplateConfig {
                                        @Bean
                                        @LoadBalanced
                                        public RestTemplate restTemplate() {
                                            return new RestTemplate();
                                        }
                                    }
                                    

                                    RestTemplate加了@LoadBalanced注解后,会被LoadBalancerInterceptor拦截,内部依然是调用Ribbon的RibbonLoadBalancerClient实现负载均衡。

                                    @RestController
                                    @RequestMapping("/a")
                                    public class DemoAController {
                                        @Autowired
                                        private RestTemplate restTemplate;
                                        @GetMapping("/callB3")
                                        public String callB3(@RequestParam("name") String name) {
                                            String url = String.format("http://%s/b/world?name=%s", "demo-b", name);
                                            return restTemplate.exchange(url, HttpMethod.GET, null, String.class).getBody();
                                        }
                                    }
                                    

                                    测试OK,如下图:

                                    【Spring Cloud Alibaba】(一)微服务介绍 及 Nacos注册中心实战,在这里插入图片描述,第17张


                                    总结

                                    至此,今天带来的Spring Cloud Alibaba教程,我们已经实现了一个简易的微服务框架,服务之间能相互发现及调用。

                                    简单串一下本文都讲了什么:本文先从我对微服务的理解,再到注册中心Nacos的理解和安装,最后进行了Spring Cloud Alibaba的源码实战!其实如果你真正消化了,你就会发现原来Spring Cloud Alibaba上手这么容易,可能只是 缺少一次实践!如果你在实践过程中遇到任何问题,非常欢迎联系我!


                                    最后

                                    微服务有多么重要我就不必多说了,我们已看到,在过去的这些年中有许多项目使用了微服务,并且到目前为止结果都还不错。

                                    另外,Spring Cloud Alibaba作为当前国内最强的微服务框架,即使你的工作中可能没用过微服务,但如果出去找工作,大概率面试官会要求你懂微服务,所以,作为Java程序员,微服务已经成为我们必不可少的一个技能,也是用人单位考核的重要标准,所以必须吃透!

                                    其实,在实际的项目中,微服务之间调用,使用RestTemplate 的方式已经用的不多,因为还有更简单、更方便、更强大 的调用方式,这也是我计划将在下文分享的内容,如果感觉不错,欢迎订阅本专栏,后面还有更多的【Spring Cloud Alibaba】实战知识陆续放出。

                                    关注我 天罡gg 分享更多干货: https://blog.csdn.net/scm_2008

                                    大家的「关注❤️ + 点赞👍 + 收藏⭐」就是我创作的最大动力!谢谢大家的支持,我们下文见!