温馨提示:注意版本问题,不复杂,就是呀呀的版本选不好,Game Over…..
没有从入门开始写,这点应该能入门,装x用的文章,首次编写,有疑问留言(看到也不想回你),没疑问,谢谢惠顾!喜欢就点个赞!!!
引文:单体架构是微服务架构出现之前,最经典的软件架构类型,许多早期的项目采用的也都是单体架构。单体架构将应用程序中所有业务逻辑都编写在同一个工程中,最终经过编译、打包,部署在一台服务器上运行。
微:体积小,简单
服务:功能实现。
微服务 = 体量小,复杂程度低的功能实现模块
微服务架构:微服务是一种全新的系统架构设计风格,每个服务只专注于做好一件事(三十六行,行行出状元)“专业的人做专业的事”。简单来说:就是把单体服务,拆了再拆,构建成体量小的模块,每个模块构成一个服务,多个服务的集合就是微服务架构。SpringCloud的诞生,就是来管理这些微小服务之间沟通的(不止于SpringCloud、Dubbo等)。
面试题:见附录
引文:“工具”指一些列功能的集合体,泛指工作时所需用的器具。
Spring Cloud 被称为构建分布式微服务系统的“全家桶”,它并不是某一门技术,而是一系列微服务解决方案或框架的有序集合。更有效的实现开发应用管理的“工具”。
Spring Cloud 将市面上成熟的、经过验证的微服务框架整合起来,并通过 Spring Boot 的思想进行再封装,屏蔽调其中复杂的配置和实现原理,最终为开发人员提供了一套简单易懂、易部署和易维护的分布式系统开发工具包。
Distributed/versioned configuration 分布式/版本化的配置管理
Service registration and discovery 服务注册与服务发现
Routing 路由
Service-to-service calls 端到端的调用
Load balancing 负载均衡
Circuit Breakers 断路器
Global locks 全局锁
Leadership election and cluster state 选举与集群状态管理
Distributed messaging 分布式消息
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,需求定时发送你的定位…那么定位系统如何实现?不清楚,但是百度、高德可支持(软件+硬件),此时我们就需要通过远程调用的方式,调用第三方系统暴露的接口实现
创建Maven父工程:springcloud-nacose(不使用快捷创建-看个人习惯)
父工程:pom依赖如下
1
2
创建子模块:nacos-provider-8000
nacos-provider-8000子模块:pom依赖如下
1
5
注意事项:
1 @SpringBootApplication
2 public class NacosProviderApp {
3 public static void main(String[] args) {
4 SpringApplication.run(NacosProviderApp.class);
5 }
6 }
1 #当前模nacos-provider-8000块服务端口
2 server.port=8000
3 #当前服务应用上下文路径:项目路径
4 #server.servlet.context-path=/provider
1 @Data
2 public class EntityInfo {
3 private String entityId;
4 private String entityInfo;
5 private String sendTime;
6 }
com.nacosprovider下新建包:service,并新增EntityInfoService
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 }
com.nacosprovider下新建包:controller,并新增NacosProviderController
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 }
启动服务测试访问/postman测试均可:http://localhost:8000/provider/entityInfo/11
实际开发中:服务提供这将编写接口文档(API文档),说明接口调用规则,入参,返参等。
新建子模块过程、配置文件、启动类、pom依赖(可移除lombok组件)略
新建包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 }
新建包com.nacoseconsumer.controller,类NacosConsumerController
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 * @param
12 * @return
13 */
14 @GetMapping("/entityInfo/{entityId}")
15 public String queryEntityInfo(@PathVariable("entityId") String entityId){
16 String url = "http://localhost:8000/provider/entityInfo/"+entityId;
17 ResponseEntity
18 return forEntity.getBody();
19 }
20 }
启动服务测试/posman访问:http://localhost:9000/consumer/entityInfo/11
使用注册中心能够实现服务治理,服务动态扩容,以及服务调用的负载均衡。
Nacos 官网(下载、文档、安装、启停服务*附录)
父工程新增依赖
1
2
9
10
nacos-provider-8000 新增pom依赖
1
2
nacos-consumer-9000 新增pom依赖
说明:Spring Cloud LoadBalancer是一个客户端负载均衡器,类似于Ribbon,但是由于Ribbon已经进入维护模式,并且Ribbon 2并不与Ribbon 1相互兼容,所以Spring Cloud全家桶在Spring Cloud Commons项目中,添加了Spring cloud Loadbalancer作为新的负载均衡器,并且做了向前兼容。
Nacos内部已经整合Ribbon(负载均衡器),所以RestTemplate与Nacos整合使用时,管理RestTemplate的bean推荐使用LoadBalancer。
优化RestTmplate的bean管理,新增注解
1 @Bean
2 @LoadBalanced
3 public RestTemplate getRestTemplate(){
4 return new RestTemplate();
5 }
更改Cotroll,使用服务名称实现远程调用(通过注册中的服务名称实现调用,摈弃维护IP、端口)
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
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
(通常服务名唯一,所以列表如果不为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 @Autowired
13 private LoadBalancerClient loadBalancerClient;
14 /**
15 * 服务发现客户端
16 */
17 @Autowired
18 private DiscoveryClient discoveryClient;
19
20 /**
21 * @param
22 * @return
23 * @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 ListserviceInstanceList = 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 ResponseEntityforEntity = 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)
2.2.x, 2.3.x (Starting with SR5)
2.1.x
2.0.x
1.5.x
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
手机扫一扫
移动阅读更方便
你可能感兴趣的文章