温馨提示:注意版本问题,不复杂,就是呀呀的版本选不好,Game Over.....
没有从入门开始写,这点应该能入门,装x用的文章,首次编写,有疑问留言(看到也不想回你),没疑问,谢谢惠顾!喜欢就点个赞!!!
引文:单体架构是微服务架构出现之前,最经典的软件架构类型,许多早期的项目采用的也都是单体架构。单体架构将应用程序中所有业务逻辑都编写在同一个工程中,最终经过编译、打包,部署在一台服务器上运行。
微:体积小,简单
服务:功能实现。
微服务 = 体量小,复杂程度低的功能实现模块
微服务架构:微服务是一种全新的系统架构设计风格,每个服务只专注于做好一件事(三十六行,行行出状元)“专业的人做专业的事”。简单来说:就是把单体服务,拆了再拆,构建成体量小的模块,每个模块构成一个服务,多个服务的集合就是微服务架构。SpringCloud的诞生,就是来管理这些微小服务之间沟通的(不止于SpringCloud、Dubbo等)。
面试题:见附录
引文:“工具”指一些列功能的集合体,泛指工作时所需用的器具。
Spring Cloud 被称为构建分布式微服务系统的“全家桶”,它并不是某一门技术,而是一系列微服务解决方案或框架的有序集合。更有效的实现开发应用管理的“工具”。
Spring Cloud 将市面上成熟的、经过验证的微服务框架整合起来,并通过 Spring Boot 的思想进行再封装,屏蔽调其中复杂的配置和实现原理,最终为开发人员提供了一套简单易懂、易部署和易维护的分布式系统开发工具包。
SpringCloud与SprigBoot版本关系见附录(官网)
2018 年 12 月12 日,Netflix 公司宣布 Spring Cloud Netflix 系列大部分组件都进入维护模式,不再添加新特性。这严重地限制了 Spring Cloud 的高速发展,于是各大互联网公司和组织开始把目光转向 Spring Cloud 的第二代实现:Spring Cloud Alibaba。
Spring Cloud Alibaba 包含了多种开发分布式微服务系统的必需组件
Nacos 即 Dynamic Naming and Configuration Service(动态命名与配置服务)。由 Naming 前两个字母,Configuration 前两个字母,以及 Service 首字母组成。
Nacos 是一个更易于构建云原生应用的动态服务发现、配置管理 以及 服务管理平台。
简单的理解:
Nacos 就是 注册中心 + 配置中心。即 Nacos = Eureka + Config + Bus。
学习条件:
为什么要学习注册中心?
微服务架构,就是很多小服务的集合体,对多个服务进行单独管理是比较麻烦。服务之间调用,A调用B,如果B因特殊需要(比如他很开心),想要频繁更换端口或IP地址,那么A服务中的代码怎么办?跟着重复更新....维护比较麻烦。注册中心可以解决这一问题。
注册中心能干什么?

服务注册,服务发现是什么东东?怎么理解?
简单理解,服务提供方把自己的服务名+端口告诉了注册中心,注册中心,统一定义,统一管理。这一过程就是服务注册。反之服务发现,自己能理解吧!不能就百度...
主要功能
服务发现和服务健康监测
动态配置服务
动态DNS服务
服务及其元数据管理
1. 新建Maven父工程springcloud-alibaba-parent
2. 新建子模块nacos-provider-8000
- 提供Ctroller、Service、Mapper(略,暂定使用集合数据充当DB)
- 提供对外接口,http://ip+端口/URI/entityInfo
3. 新建子模块nacos-consumer_9000
- 提供Ctroller,实现远程调用nacos-provider-8000工程对外提供数据接口
实现远程调用,需要了解Http协议,请求头,请求行,请求体,数据传输方式等(WEB阶段Tomcat、Servlet学习)。
远程调用方式繁多(更多远程操作方式见附录)
为什么要学习并使用远程调?演示远程调用
例如:开发一款名为:智尚专属的APP,需求定时发送你的定位...那么定位系统如何实现?不清楚,但是百度、高德可支持(软件+硬件),此时我们就需要通过远程调用的方式,调用第三方系统暴露的接口实现



1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns="http://maven.apache.org/POM/4.0.0" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 5 <modelVersion>4.0.0</modelVersion> 6 7 <groupId>org.example</groupId> 8 <artifactId>spingcloud-nacos</artifactId> 9 <packaging>pom</packaging>10 <version>1.0-SNAPSHOT</version>11 <!-- 引入子模块,子模块新建后IDEA默认自动构建 -->12 <modules>13 <module>nacos-provider-8000</module>14 </modules>15 16 <!-- 版本管理 -->17 <properties>18 <maven.compiler.source>8</maven.compiler.source>19 <maven.compiler.target>8</maven.compiler.target>20 <springbootstart.version>2.4.2</springbootstart.version>21 </properties>22 <!-- 依赖管理,仅管理,非导入,子模块:按需手动导入相关依赖,可以省略版本version -->23 <dependencyManagement>24 <!-- springboot 提供了N个start依赖 ,spring-boot-dependencies可以帮我们统一依赖 -->25 <dependencies>26 <dependency>27 <groupId>org.springframework.boot</groupId>28 <artifactId>spring-boot-dependencies</artifactId>29 <version>${springbootstart.version}</version>30 <type>pom</type>31 <scope>import</scope>32 </dependency>33 <!-- lombok组件-简化POJO开发 -->34 <dependency>35 <groupId>org.projectlombok</groupId>36 <artifactId>lombok</artifactId>37 <version>1.18.22</version>38 </dependency>39 </dependencies>40 </dependencyManagement>41 </project>


1 <properties> 2 <maven.compiler.source>8</maven.compiler.source> 3 <maven.compiler.target>8</maven.compiler.target> 4 </properties> 5 <dependencies> 6 <!-- web依赖,用以可用Sring/MVC相关注解 --> 7 <dependency> 8 <groupId>org.springframework.boot</groupId> 9 <artifactId>spring-boot-starter-web</artifactId>10 </dependency>11 <!-- lombok组件模块-便于开发POJO -->12 <dependency>13 <groupId>org.projectlombok</groupId>14 <artifactId>lombok</artifactId>15 </dependency>16 </dependencies>
注意事项:
- 父工程pom中需使用<modules>标签指向子模块(IDEA默认新建子模块时自动构建)
- 子模块需使用<parent>标签引入父工程
1 @SpringBootApplication2 public class NacosProviderApp {3 public static void main(String[] args) {4 SpringApplication.run(NacosProviderApp.class);5 }6 }
1 #当前模nacos-provider-8000块服务端口2 server.port=80003 #当前服务应用上下文路径:项目路径4 #server.servlet.context-path=/provider
1 @Data2 public class EntityInfo {3 private String entityId;4 private String entityInfo;5 private String sendTime;6 }
1 @Service 2 public class EntityInfoService { 3 public EntityInfo queryEntityInfo(String entityId){ 4 EntityInfo entityInfo = new EntityInfo(); 5 entityInfo.setEntityId(entityId); 6 // return mapper.queryEntityInfo(entityInfo); 7 entityInfo.setSendTime("xxxx年xx月xx日 HH:mm:ss"); 8 entityInfo.setEntityInfo("Hello Nacos!"); 9 return entityInfo;10 }11 }
1 @RestController 2 @RequestMapping("/provider") 3 public class NacosProviderController { 4 5 @Autowired 6 private EntityInfoService entityInfoService; 7 8 @GetMapping("/entityInfo/{entityId}") 9 public EntityInfo queryEntityInfo(@PathVariable("entityId") String entityId){10 return entityInfoService.queryEntityInfo(entityId);11 }12 13 }

实际开发中:服务提供这将编写接口文档(API文档),说明接口调用规则,入参,返参等。
新建包com.nacoseconsumer.config,类BeanManagerConfig
1 @Component 2 class BeanManagerConfig { 3 /** 4 * Spring框架提供的RestTemplate类可用于在应用中调用rest服务 5 */ 6 @Bean 7 public RestTemplate getRestTemplate(){ 8 return new RestTemplate(); 9 }10 }
1 @RestController 2 @RequestMapping("/consumer") 3 public class NacosConsumerController { 4 /** 5 * Spring框架提供的RestTemplate类可用于在应用中调用rest服务 6 */ 7 @Autowired 8 private RestTemplate restTemplate; 9 /**10 * @Description 请求第三方远程接口11 * @param12 * @return13 */14 @GetMapping("/entityInfo/{entityId}")15 public String queryEntityInfo(@PathVariable("entityId") String entityId){16 String url = "http://localhost:8000/provider/entityInfo/"+entityId;17 ResponseEntity<String> forEntity = restTemplate.getForEntity(url, String.class);18 return forEntity.getBody();19 }20 }
使用注册中心能够实现服务治理,服务动态扩容,以及服务调用的负载均衡。
1 <!-- SpringCloud依赖 --> 2 <dependency> 3 <groupId>org.springframework.cloud</groupId> 4 <artifactId>spring-cloud-dependencies</artifactId> 5 <version>2020.0.1</version> 6 <type>pom</type> 7 <scope>import</scope> 8 </dependency> 9 <!-- SpringCloudAlibaba依赖 -->10 <dependency>11 <groupId>com.alibaba.cloud</groupId>12 <artifactId>spring-cloud-alibaba-dependencies</artifactId>13 <version>2021.1</version>14 <type>pom</type>15 <scope>import</scope>16 </dependency>
1 <!-- 基于SpringCloud alibaba提供的针对Nacos的组件:服务注册与发现 -->2 <dependency>3 <groupId>com.alibaba.cloud</groupId>4 <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>5 </dependency>
<!-- 基于SpringCloud alibaba提供的针对Nacos的组件:服务注册与发现 --><dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!-- 负载均衡依赖 --><dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency>
说明:Spring Cloud LoadBalancer是一个客户端负载均衡器,类似于Ribbon,但是由于Ribbon已经进入维护模式,并且Ribbon 2并不与Ribbon 1相互兼容,所以Spring Cloud全家桶在Spring Cloud Commons项目中,添加了Spring cloud Loadbalancer作为新的负载均衡器,并且做了向前兼容。
Nacos内部已经整合Ribbon(负载均衡器),所以RestTemplate与Nacos整合使用时,管理RestTemplate的bean推荐使用LoadBalancer。
1 @Bean2 @LoadBalanced3 public RestTemplate getRestTemplate(){4 return new RestTemplate();5 }
1 @GetMapping("/entityInfo/{entityId}")2 public String queryEntityInfo(@PathVariable("entityId") String entityId) {3 String url = "http://nacos-provider/provider/entityInfo/" + entityId;4 System.out.println(url);5 ResponseEntity<String> forEntity = restTemplate.getForEntity(url, String.class);6 return forEntity.getBody();7 }
说明:不使用注解,不使用LoadBalancer,直接改URL的IP为服务提供者的服务名称调用会报错java.net.UnknownHostException: nacos-provider
原因:Nacos内部已经整合Ribbon(负载均衡器),RestTemplate与Nacos整合使用时,需要开启负载均衡,因此管理RestTemplate的bean必须使用注解@LoadBalanced,表示开启负载均衡。否则无法直接通过“服务提供者的服务名”访问。
2.必须使用IP访问肿么办?
可以注入LoadBalancerClient,根据服务名称获取ServiceInstance,再获取IP+PORT即可,此时维护RestTemplate是就无需使用@LoadBalanced。
可以注入DiscoveryClient (服务发现工具类),根据服务名获取列表List<ServiceInstance>(通常服务名唯一,所以列表如果不为null长度也是1).
1 @RestController 2 @RequestMapping("/consumer") 3 public class NacosConsumerController { 4 /** 5 * Spring框架提供的RestTemplate类可用于在应用中调用rest服务 6 */ 7 @Autowired 8 private RestTemplate restTemplate; 9 /**10 * 负载均衡客户端11 */12 @Autowired13 private LoadBalancerClient loadBalancerClient;14 /**15 * 服务发现客户端16 */17 @Autowired18 private DiscoveryClient discoveryClient;19 20 /**21 * @param22 * @return23 * @Description 请求第三方远程接口24 */25 @GetMapping("/entityInfo/{entityId}")26 public String queryEntityInfo(@PathVariable("entityId") String entityId) {27 String url = "http://nacos-provider/provider/entityInfo/" + entityId;28 29 // 使用以下方式,则需要干掉restTemplate负载均衡注解,开启负载均衡,Ncose中就只能通过服务名调用服务了30 // 负载均衡发现服务31 ServiceInstance serviceInstance = loadBalancerClient.choose("nacos-provider");32 String uri = "http://" + serviceInstance.getHost() + ":" + serviceInstance.getPort();33 url = uri + "/provider/entityInfo/" + entityId;34 // 注册与发现,发现服务客户端获取服务35 List<ServiceInstance> serviceInstanceList = discoveryClient.getInstances("nacos-provider");36 serviceInstanceList.get(0).getPort();37 serviceInstanceList.get(0).getHost();38 serviceInstanceList.get(0).getUri();39 40 System.out.println(serviceInstanceList.get(0).getUri());41 ResponseEntity<String> forEntity = restTemplate.getForEntity(url, String.class);42 return forEntity.getBody();43 }44 }
登入Nacos官网,登入GitHub,也可以直接进入GitHub搜索“Nacos”


2. 安装
理论上直接解压即可,只要下对了宝宝!
3.启停
启停分为单机版(入门常规)、集群版(高可用)
windows命令:
1 startup.cmd -m standalone命令说明:startup.cmd 启动程序,双击或DOS命令均可(双击启动请继续看完)
参数说明:-m 模式模型,standalone 标识-单机模式启动
双击启动文件启动(需手动修改启动文件)
1 原:cluster标识集群模式2 set MODE="cluster"3 修改为:standalone标识单机模式4 set MODE="standalone"
4.基本配置
| 不同点 | 微服务架构 | 单体架构 |
|---|---|---|
| 团队规模 | 微服务架构可以将传统模式下的单个应用,拆分为多个独立的服务,每个微服务都可以单独开发、部署和维护。每个服务从设计、开发到维护所需的团队规模小,团队管理成本小。 | 单体架构的应用程序通常需要一个大型团队,围绕一个庞大的应用程序工作,团队管理的成本大。 |
| 数据存储方式 | 不同的微服务可以使用不同的数据存储方式,例如有的用 Redis,有的使用 MySQL。 | 单一架构的所有模块共享同一个公共数据库,存储方式相对单一。 |
| 部署方式 | 微服务架构中每个服务都可以独立部署,也可以独立于其他服务进行扩展。如果部署得当,基于微服务的架构可以帮助企业提高应用程序的部署效率。 | 采用单体架构的应用程序的每一次功能更改或 bug 修复都必须对整个应用程序重新进行部署。 |
| 开发模式 | 在采用微服务架构的应用程序中,不同模块可以使用不同的技术或语言进行开发,开发模式更加灵活。 | 在采用单体架构的应用程序中,所有模块使用的技术和语言必须相同,开发模式受限。 |
| 故障隔离 | 在微服务架构中,故障被隔离在单个服务中,避免系统的整体崩溃。 | 在单体架构中,当一个组件出现故障时,故障很可能会在进程中蔓延,导致系统全局不可用。 |
| 项目结构 | 微服务架构将单个应用程序拆分为多个独立的小型服务,每个服务都可以独立的开发、部署和维护,每个服务都能完成一项特定的业务需求。 | 单体架构的应用程序,所有的业务逻辑都集中在同一个工程中。 |
2021.0.x aka Jubilee | 2.6.x |
2020.0.x aka Ilford | 2.4.x, 2.5.x (Starting with 2020.0.3) |
Hoxton | 2.2.x, 2.3.x (Starting with SR5) |
Greenwich | 2.1.x |
Finchley | 2.0.x |
Edgware | 1.5.x |
Dalston | 1.5.x |
| 功能 | Dubbo | SpringCloud |
|---|---|---|
| 服务注册中心 | Zookeeper | Eureka(主流)、Consul、zookeeper |
| 服务调用方式 | RPC基于Dubbo协议 | REST API 基于Http协议 |
| 服务监控 | Dubbo-Monitor | Spring Boot Admin |
| 熔断器 | 不完善 | Spring Cloud Netflix Hystrix |
| 服务网关 | 无 | Spring Cloud Netflix Zuul、Gateway |
| 分布式配置 | 无 | Spring Cloud Config |
| 服务跟踪 | 无 | Spring Cloud Sleuth+Zipkin(一般) |
| 数据流 | 无 | Spring Cloud Stream |
| 批量任务 | 无 | Spring Cloud Task |
| 信息总线 | 无 | Spring Cloud Bus |