一.引言
- 什么是微服务?
- 官方定义解释:微服务就是由一系列服务功能组成,能单独跑在自己的进程里,每个服务独立开发,独立部署,分布式的管理。
- 微服务特点?
- 由一系列小服务组成
- 独立的运行在自己的计算机进程
- 独立部署
- 基于分布式管理的服务
- 为什么会出现微服务?
- 单体架构
优点:易部署、易测试
缺点:开发效率低、代码难维护、部署不灵活、稳定性不高、扩展性不高(上手难) - 架构的演变
ORM(单一架构) —>MVC(垂直架构) —>RPC(分布式架构) —>SOA(流动式架构)
- .微服务解决方案(阿里系、SpringCloud栈)
- 阿里系(核心技术Dubbo) ~”Dubbo死于13年,复活于17年“
Dubbo、Zookeeper、SpringMVC or SpringBoot … - SpringCloud(一栈式,微服务开发) ~“栈,指全栈”
SpringCloud Netflix Eureka、SpringBoot …
-
什么是SpringCloud
SpringCloud 是一个 包括多个子项目的开发工具集,集合了众多的开源框架(简称”集合工具集 “) ,他利用SpringBoot开发的便利性,实现了很多功能,如:服务注册,负载均衡等。SpringCloud在整合过程中主要针对Netflix(耐非)开源组件的封装。
SpringCloud的出现,真正的简化了分布式架构的开发。 -
SpringCloud的特性
服务注册和发现、 路由、service - to - service调用、负载均衡、 断路器 -
服务架构图
1.5、引言补充
- SpringCloud主要框架
服务发现——Netflix Eureka
服务调用——Netflix Feign
熔断器——Netflix Hystrix
服务网关——Netflix Zuul
分布式配置——Spring Cloud Config
消息总线 —— Spring Cloud Bus - Spring Cloud和Dubbo对比
Dubbo | Spring Cloud | |
---|---|---|
服务注册中心 | Zookeeper | Spring Cloud Netflix Eureka |
服务调用方式 | RPC | REST API |
服务网关 | 无 | Spring Cloud Netflix Zuul |
熔断器 | 不完善 | Spring Cloud Netflix Hystrix |
分布式配置 | 无 | Spring Cloud Config |
服务跟踪 | 无 | Spring Cloud Sleuth |
消息总线 | 无 | Spring Cloud Bus |
数据流 | 无 | Spring Cloud Stream |
批量任务 | 无 | Spring Cloud Task |
…… | …… | …… |
- SpringCloud的版本
SpringCloud由于是一系列框架组合,为了避免与包含的自框架版本产生混淆,采用伦敦地铁站的名称作为版本名,形式为版本名+里程碑号。 M9为第9个里程碑版本。
以下是SpringBoot与Spring Cloud版本的对照表.
Spring Boot | Spring Cloud |
---|---|
1.2.x | Angel版本 |
1.3.x | Brixton版本 |
1.4.x | Camden版本 |
1.5.x | Dalston版本、Edgware版本 |
2.0.x | Finchley版本 |
二.Eureka 服务端开发/客户端开发
- Eureka是一个基于REST(Representational State Transfer)的服务,主要用于AWS cloud, 提供服务定位(locating services)、负载均衡(load balancing)、故障转移(failover of middle-tier servers)。我们把它叫做Eureka Server. Eureka也提供了基于Java的客户端组件,Eureka Client,内置的负载均衡器可以实现基本的round-robin负载均衡能力。在Netflix,一个基于Eureka的更复杂的负载均衡器针对多种因素(如流量、资源利用率、错误状态等)提供加权负载均衡,以实现高可用(superior resiliency).
Eureka是Netflix开发的服务发现框架,SpringCloud将它集成在自己的子项目
spring-cloud-netflix中,实现SpringCloud的服务发现功能。Eureka包含两个组件:Eureka Server和Eureka Client。
Eureka Server提供服务注册服务,各个节点启动后,会在Eureka Server中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。
Eureka Client是一个java客户端,用于简化与Eureka Server的交互,客户端同时也就别一个内置的、使用轮询(round-robin)负载算法的负载均衡器。在应用启动后,将会向Eureka Server发送心跳,默认周期为30秒,如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,Eureka Server将会从服务注册表中把这个服务节点移除(默认90秒)。
Eureka Server之间通过复制的方式完成数据的同步,Eureka还提供了客户端缓存机制,即使所有的Eureka Server都挂掉,客户端依然可以利用缓存中的信息消费其他服务的API。综上,Eureka通过心跳检查、客户端缓存等机制,确保了系统的高可用性、灵活性和可伸缩性。
- eureka的注册中心开发步骤
①引入依赖 (注意版本的对应锁定)
②配置eureka的配置文件
③开发入口类 加入如下注解@EnableEurekaServer 用在类上,代表这个启动是一个eurekaServer
④启动eureka项目
⑤访问 示例:http://localhost:8761
[ ctrl+c 停止jar包形式启动的eureka ]
- eureka客户端开发
① 引入eureka 客户端依赖
② 开发服务类(区别dubbo,类是controller类)
③暴露服务 并注册eureka的注册中心:application.yml
④只需在入口类Application加上 注解@EnableEurekaClient 即可,低耦合 ; 注解@EnableDiscoveryClient 也可以,更通用,不耦合一种注册中心
三.SpringCloud 通信方式
- 两大协议对比 HTTP vs RPC
- Dubbo “是一个RPC框架,底层是TCP协议通信框架”
①基于tcp协议基础,封装出dubbo协议,rmi协议
基于dubbo 开发的应用还是要依赖周边的平台生态, 相比其它的RPC框架, dubbo 在服务治理与服务集成上可谓是非常常完善, 不仅提供了服务注册,发现还提供了负载均衡,集群容错等基础能力同时,还提供了面向开发测试节点的Mock 和泛化调用等机制。 在spring cloud 出现之前dubbo 在国内应十分广泛,但dubbo 定位始终是一个RPC框架。
- SpringCloud “轻量级HTTP协议”
①通信方式: http + restful 方式
②坚持HTTP协议原因:
1)springcloud的目标是微服务架构下一栈式解决;
2)使用http+restful方式通信(轻量易用适用性强),可以做到跨语言,跨平台和与已有系统集成。
SpringCloud 的目标是微服务架构下的一栈式解决方案,自dubbo 复活后dubbo 官方表示要积极适配到springcloud的生态方式,比如作为springcloud的二进制通信方案来发挥dubbo 的性能优势,或者通过dubbo 的模块化以及对http的支持适配到SpringCloud,但是到目前为止dubbo 与springclo ud 还是不怎么兼容,springcloud 微服务架构下微服务之间使用http的RestFul方式进行通信,HttpR estFul 本身轻量易用适用性强,可以很容易跨语言,跨平台,或者与已有的系统集成。
四.开发服务的消费者/Eureka的客户端(两种调用方式:一种ribbon + restTemplate,另一种frign)
在微服务架构中,业务都会被拆分成一个个独立的服务,服务之间通讯是基于http restful的。
- ribbon
- ribbon是一个负载均衡客户端,可以很好的控制http和tcp一些行为。Feign默认集成ribbon。
- 开发SpringCloud的服务
①创建客户端服务工程 引入依赖
②配置client的服务注册中心 application.yml
③开发入口类
- 第一种方式 (非注册中心模型,是直接访问访问,与服务中心无关)
//第一种方式调用
RestTemplate restTemplate = new RestTemplate();
//参数 暴露的接口url,返回值string
String forObject = restTemplate.getForObject("http://localhost:8989/hello/hello?name=" +name, String.class);
return forObject;
问题:耦合主机名和端口号
- 第二种方式
@Autowired
//用来负载均衡的客户端
private LoadBalancerClient loadBalancerClient;
//第二种方式调用
//choose用来书写调用eureka服务名称,可以拿到端口服务(可getHost和getPort)
ServiceInstance serviceInstance = loadBalancerClient.choose("HELLO-SERVICE");
RestTemplate restTemplate = new RestTemplate();
String url="http://"+serviceInstance.getHost()+":"+serviceInstance.getPort();
String forObject = restTemplate.getForObject( url+"/hello/hello?name="+name, String.class);
return forObject;
- 第三种方式(建议)
//先封装工具类
@Configuration
public class Beans {
@Bean
@LoadBalanced //1.解决该服务在集群环境下,负载均衡
//2.解决问题:UnknownHostException: HELLO-SERVICE
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
@Autowired
//DI
private RestTemplate restTemplate;
//第三种方式
String forObject = restTemplate.getForObject("http://HELLO-SERVICE/hello/hello?name=" + name, String.class);
return forObject;
五.Eureka高可用(Eureka Server的集群 )
EurekaServer在微服务中架构中非常重要,若宕机会导致整个微服务架构崩溃,所以解决EurekaServer在现有系统中,高可用是势在必行的。
- 准备两个EurekaServer 告知互相的备组件是谁即可
六.SpringCloud在项目中的实战应用 (商城APP功能)
示例:
电商系统的服务拆分 ---- product_service商品服务
---- product_order商品订单
☆利用restTemplate 进行两端发布服务调用