【Spring Cloud Alibaba】(一)微服务介绍 及 Nacos注册中心实战

news2024/12/25 12:46:24

CSDN成就一亿技术人

文章目录

  • 前言
  • 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架构的主要区别是去中心化,比较经典的图例:
    SOA与微服务架构对比

  • 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 和其它的实现如 Netflix, Consul,Zookeeper 等的对比


II、Nacos 注册中心

微服务是去中心化的,为什么还有注册中心?
如果你还没有真正理解微服务和注册中心,那么这个问题多半会懵🤔
实际上,这个去中心化,是指服务与服务之间的调用是去中心化的调用,也就是点对点的调用。而注册中心正是为了实现去中心化调用起到了的至关重要的作用,用于服务注册和服务发现,这样通过注册中心,各个服务之间就可以相互发现,就为去中心化的调用提供了必备条件。

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

对于注册中心,常见的有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
Nacos压缩包下载列表
我下载的是 nacos-server-1.4.2.zip,下载直接解压运行即可,解压后:
nacos-server解压后
进入bin目录,打开cmd,执行以下命令启动

startup.cmd -m standalone

cmd启动nacos
启动成功,访问Nacos控制台:http://localhost:8848/nacos/index.html
用户名:nacos
密码:nacos
nacos1.4.2控制台界面
至此,Window单机模式的Nacos注册中心就安装完成并能正常启动了,非常简单易上手,接下来,让咱们来连接Nacos注册中心开始源码实战吧!


III、Spring Cloud Alibaba Nacos 实战

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

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

关于Spring Cloud Alibaba版本选型

  • 官方的版本说明
    Spring Cloud Alibaba版本说明
  • 我们的选择版本
Spring Cloud Alibaba VersionSpring Cloud VersionSpring Boot VersionNacos Version
2.2.7.RELEASEHoxton.SR122.3.12.RELEASE1.4.2
  • 最终工程结构
    在创建服务之前,我们先预览一下全貌,如下图:
    在这里插入图片描述

1、新建父工程

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

<properties>
    <maven.compiler.source>8</maven.compiler.source>
    <maven.compiler.target>8</maven.compiler.target>
    <spring-boot.version>2.3.12.RELEASE</spring-boot.version>
    <spring-cloud.version>Hoxton.SR12</spring-cloud.version>
    <spring-cloud-alibaba.version>2.2.7.RELEASE</spring-cloud-alibaba.version>
    <spring.version>5.2.21.RELEASE</spring.version>
    <dubbo.version>2.7.18</dubbo.version>
</properties>

<dependencyManagement>
    <dependencies>
        <!-- bom start -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-framework-bom</artifactId>
            <version>${spring.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <!-- duboo-->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-dependencies-bom</artifactId>
            <version>${dubbo.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <!-- spring cloud alibab-->
        <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>
        <!-- spring boot-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>${spring-boot.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <!-- spring cloud-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <!-- bom end -->
    </dependencies>
</dependencyManagement>

2、新建demo-a 服务

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

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

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- Spring Cloud Nacos Service Discovery -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
    </dependencies>
    
  • 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
    demo-a启动成功并注册到nacos

  • 通过Nacos 控制台查看注册结果
    nacos查看服务列表

  • 通过Nacos Open API查看注册结果
    API地址:http://localhost:8848/nacos/v1/ns/instance/list?serviceName=demo-a
    nacos open API查看服务注册结果

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服务,查看注册结果

在这里插入图片描述


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,如下图:
在这里插入图片描述

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,如下图:
在这里插入图片描述
这样就实现了按服务名的负载均衡调用,当我们启动多个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的理解和安装,最后进行了Spring Cloud Alibaba的源码实战!其实如果你真正消化了,你就会发现原来Spring Cloud Alibaba上手这么容易,可能只是 缺少一次实践!如果你在实践过程中遇到任何问题,非常欢迎联系我!


最后

微服务有多么重要我就不必多说了,我们已看到,在过去的这些年中有许多项目使用了微服务,并且到目前为止结果都还不错。
另外,Spring Cloud Alibaba作为当前国内最强的微服务框架,即使你的工作中可能没用过微服务,但如果出去找工作,大概率面试官会要求你懂微服务,所以,作为Java程序员,微服务已经成为我们必不可少的一个技能,也是用人单位考核的重要标准,所以必须吃透!

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

关注我 天罡gg 分享更多干货: https://blog.csdn.net/scm_2008
大家的「关注❤️ + 点赞👍 + 收藏⭐」就是我创作的最大动力!谢谢大家的支持,我们下文见!


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/194707.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JS 设计模式(2)-- 复习

目录 策列模式 代理模式 观察者模式 发布订阅模式 模块模式 策列模式 策略模式定义了一系列算法&#xff0c;并将每个算法封装起来&#xff0c;使他们可以相互替换&#xff0c;且算法的变化不会影响使用算法的用户&#xff0c;策列模式属于对象行为模式&#xff0c;它通过…

Java面试题(自用-持续更新)

本文目录如下&#xff1a;Java面试题一、基础知识JDK 和 JRE 有什么区别&#xff1f;String 属于基础的数据类型吗&#xff1f;基础类型有哪些?String str"xqz"与 String strnew String("xqz")一样吗&#xff1f;java 中操作字符串都有哪些类&#xff1f;…

王佩丰 Excel 基础24讲 | 学习笔记(全)

第一讲&#xff1a;认识Excel 1.简介 excel能做什么&#xff1f; 数据存储 → 数据处理 → 数据分析 → 数据呈现 excel界面 补充&#xff1a;Excel数据分析步骤 ①提出问题&#xff1a;明确自己需要通过数据分析解决什么问题 ②理解数据&#xff1a;理解数据各个字段的含义…

【手写 Promise 源码】第十五篇 - 了解 generator 生成器

一&#xff0c;前言 上一篇&#xff0c;实现了 promisify 和应用场景介绍&#xff0c;主要涉及以下几个点&#xff1a; promisify 简介和测试&#xff1b;promisify 功能的实现&#xff1a;promisify、promisifyAll&#xff1b; 目前&#xff0c;Promise 部分已基本完成&…

FPGA实现图像任意位置显示,串口协议控制显示位置,提供工程源码和技术支持

目录1、图像任意位置显示理论基础2、设计思路和架构3、OV5640图像采集4、图像DDR3三帧缓存5、图像任意位置输出显示6、串口协议控制显示位置7、vivado工程介绍8、上板调试验证9、福利&#xff1a;工程源码获取1、图像任意位置显示理论基础 图像任意位置显示指的是在显示屏上的…

Linux新手渣渣上路史

时至2022年&#xff0c;IT行业的迅速发展大家也有目共睹&#xff0c;IT行业在社会的发展中起着举足轻重的作用。其中一角Linux系统&#xff0c;从诞生到开源&#xff0c;再到现在受大众的欢迎&#xff0c;是一个很好的例子。Linux和windows类似&#xff0c;是一个操作系统&…

java 微服务高级之分布式事务 Seata框架 CAP定理 BASE理论 XA模式 AT模式 TCC模式 SAGA模式

分布式事务问题 1.1.本地事务 1.2.分布式事务 一旦有一个失败了&#xff0c;其他两个不知情失败的情况&#xff0c;还是执行并成功 在分布式系统下&#xff0c;一个业务跨越多个服务或数据源&#xff0c;每个服务都是一个分支事务&#xff0c;要保证所有分支事务最终状态一致…

【JavaEE】线程安全的集合类

引言 在Java标准库中&#xff0c;大部分集合类都是线程不安全的。Vector(比ArrayList多了同步化机制就变得线程安全了)&#xff1b;Stack(继承Vector)&#xff1b;Hashtable(只比Hashmap多了线程安全)&#xff1b;以Concurrent开头的集合类&#xff1a;ConcurrentHashMap、Con…

Echarts 用图形纹理来填充颜色(color - pattern)

第006个点击查看专栏目录在上一篇文章中已经讲过 ECharts线性渐变色示例演示&#xff08;2种渐变方式&#xff09;&#xff0c;这个示例的颜色使用纹理来做填充&#xff0c;纹理填充&#xff1a; pattern color:{ //纹理填充 image: patternImg, repeat: ‘repeat’ } 示例效果…

禾川HCQ ModBUS+485主从站调试

硬件&#xff0c;485转usb&#xff0c;如果主站是plc&#xff0c;不需要这个线&#xff0c;我现在主站是电脑&#xff0c;调试用。 HCQ0 禾川控制器。 软件 modbus tools 调试软件&#xff0c;自行下载吧&#xff0c;社区传不上去。 硬件连接时注意交叉连接&#xff0c;HCQ0 A端…

MATLAB 逻辑数组

✅作者简介&#xff1a;人工智能专业本科在读&#xff0c;喜欢计算机与编程&#xff0c;写博客记录自己的学习历程。 &#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&…

Java⽇志框架学习笔记

目录 1.⽇志概述 1.1 ⽇志是⽤来做什么的&#xff1f; 1.2 为什么要⽤到⽇志框架&#xff1f; 1.3 现有的⽇志框架有哪些&#xff1f; 1.4 ⽇志⻔⾯技术 2.logback 2.1 logback介绍 2.1.1 logback 模块 2.1.2 logback 组件 2.1.3 logback 配置 2.1.4 logback.xml 配…

2023网络爬虫 -- 获取动态数据

一、网站的正常界面1、网址https://movie.douban.com/typerank?type_name%E5%8A%A8%E4%BD%9C%E7%89%87&type5&interval_id100:90&action2、正常的页面二、爬取数据1、源代码import requests头{"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64…

首屏加载速度慢怎么解决?

一、什么是首屏加载 首屏时间&#xff08;First Contentful Paint&#xff09;&#xff0c;指的是浏览器从响应用户输入网址地址&#xff0c;到首屏内容渲染完成的时间&#xff0c;此时整个网页不一定要全部渲染完成&#xff0c;但需要展示当前视窗需要的内容 首屏加载可以说是…

分享156个ASP源码,总有一款适合您

ASP源码 分享156个ASP源码&#xff0c;总有一款适合您 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c; 156个ASP源码下载链接&#xff1a;https://pan.baidu.com/s/1Mc-zWjUyk9Lx8TXv5cvZTg?pwds2qi 提取码&#x…

Office 365用户登录审核

黑客访问端点设备&#xff0c;以窃取公司特定数据、员工个人数据或任何其他可能对他们有任何用处的有价值的信息。 为了帮助您防止这种攻击&#xff0c;我们编写了一个参数列表&#xff0c;可以帮助您识别异常日志&#xff0c;这通常是攻击的第一个标志。异常登录活动是安全漏洞…

Vue使用ElementUI的确认框进行删除操作(包含前后端代码)

前言 今天做自己项目的时候&#xff0c;有一个删除的业务&#xff0c;正好遇到了确认框&#xff0c;在此纪念一下。 这里我是使用的ElementUI的确认框&#xff01; 首先ElementUI的确认框是这么说明的&#xff1a; 从场景上说&#xff0c;MessageBox 的作用是美化系统自带的 …

Java程序员跳槽,三面全过,面试官:你这样的,我们招不起

程序员小李在沿海城市工作了8年&#xff0c;那里涨幅飞快的房价限制了程序员小李在一线城市安家的想法&#xff0c;再加上突然发生的疫情暴露了远在他乡工作的不便&#xff0c;在种种因素下&#xff0c;程序员小李决定回家工作。 既然已经下定决心告别一线城市回家乡发展&…

数据分析面试-sql练习

SQL汇总1. SQL执行顺序2. 开窗函数3. 经典SQL题3.0 数据准备3.1 ☆ 查询‘01’课程比‘02’课程成绩高的学生3.2 查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩3.3 查询在SC表存在成绩的学生信息3.4 查询所有同学的学生编号、学生姓名、选课总数、所有课程的总…

Github每日精选(第96期):微软的机器学习课程ML-For-Beginners

12 周&#xff0c;26 节课&#xff0c;52 道测验&#xff0c;适合所有人的经典机器学习。 添加链接描述 初学者机器学习 - 课程 Microsoft 的 Azure Cloud Advocates 很高兴提供为期 12 周、26 节课的全部关于机器学习的课程。在本课程中&#xff0c;您将了解有时称为经典机器…