文章目录
微服务概述
什么是微服务
-
马丁福勒博客:https://martinfowler.com/articles/microservices.html
-
用来描述将软件应用程序设计为独立可部署服务套件的特定方法。虽然这种体系结构风格没有精确的定义,但是围绕着业务能力、自动部署、端点中的智能以及语言和数据的分散控制,围绕着组织有一些共同的特征
-
简而言之架构风格是一种将单个应用程序开发为一组小服务的方法,每个服务运行在自己的流程中,并且与轻量级机制(通常是HTTP资源API)通信。这些服务是围绕业务能力建立的,并且可以由完全自动化的部署机器独立部署。这些服务的集中管理只有最低限度,可以用不同的编程语言编写并使用不同的数据存储技术。
从技术角度理解
- 微服务就是将传统的一站式项目应用,来根据业务进行拆分成一个一个的服务,从而彻底的去掉耦合
- 那么每个微服务提供了单个业务功能的服务,说白就是一个服务一个事件
- 也就一个独立的处理过程,类似进程的概念,能够独立运行和销毁,甚至拥有自己的数据库,如下单就是下单,支付就是支付
微服务与微服务架构
- 微服务架构是一种架构模式,他提倡将单位一应用程序划分成一组小的服务,服务之间互相协调,互相配合,为用户提供最终价值.
- 每个服务运行在一个独立的进程中,服务与服务间采用轻量级的通信机制互相协作(通常是基于HTTP协议的
RESTful API的风格)。 - 每个服务都是围绕着具体业务进行构建,并且能够被独立的部署到生成环境、类生产环境等。
- 另外应当尽量避免统一的集中式的服务管理机制,对具体的一个服务而言,应根据业务上下文,选择合适的语
言,工具对其进行构建。
微服务优点与缺点
优点
- 每个服务足够内聚,够小,代码容易理解这样能够明确的指定一个业务功能或者是业务需求
- 一个微服务开发简单,开发效率高,因为一个微服务就是专一的只做一个事情
- 能够被小团队进行独立的开发
- 微服务是松偶合的,是有功能意义的服务,无论是开发阶段或者是在部署阶段都是独立的。
- 微服务可以使用不同的语言进行开发。
- 容易与第三方的技术进行集成,允许容易灵活的方式集成自动部署,通过持续集成工具进行集成如Jenkins Hudson 等…
- 微服务容易让开发人员理解,修改访问维护
- 微服务允许利用融合新的技术
- 微服务只专注业务逻辑的代码,不会和HTML/CSS等前台技术以及组件混合
缺点
- 开发人员要处理分布式系统的复杂性
- 多服务运维难度加大
- 系统部署依懒
- 服务器之间的通信成本加大
- 数据的一致性
- 系统的集成测试难度加大
- 性能的监控难度加大
微服务技术栈有哪些
微服务条目 | 落地技术 |
---|---|
服务开发 | SpringBoot,Spring,SpringMVC |
服务配置与管理 | Netflix公司的Archaius,阿里的DIamond等 |
服务注册与发现 | Eurka,Consul,Zookeeper等 |
服务调用 | Rest(微服务通信),RPC(Dubbo),gRPC |
服务熔断器 | Hystrix,Envoy等 |
负载均衡 | Nginx,Ribbon等 |
服务接口调用(客户端调用服务的简化工具) | Feign等 |
消息队列 | kafka,RabbitMQ,ActiveMQ等 |
服务配置中心管理 | SpringCloudConfig,Chef等 |
服务路由(API网关) | Zuul等 |
服务监控 | Zabbix,Nagios,Metrics,Spectator等 |
全链路追踪 | Zipkin,Brave,Dapper等 |
服务部署 | Docker,OpenStack,Kubernetes等 |
数据流操作开发包 | SpringCloud Stream(封装与Redis,Rabbit,kafka等发送接收消息) |
事件消息总线 | Spring Cloud Bus |
原始分布式架构使用的技术服务
- 服务治理(如阿里巴巴的Dubbo)
- 服务的注册(如Apache_ZooKeeper)
- 服务的调用RPC
- 服务的负载均衡_(Nginx)
- 服务的监控
- 都是不同的公司的不同的技术
- 那么可不可以使用同一家个公司的技术来完成?可以使用SpringCloud
为什么选择SpringCloud作为微服务技术架构
-
整体解决方法和框架的熟悉度
-
社区的热度
-
可维护性
-
学习的路线
目前公司微服务技术架构
- 阿里的Dubbo/HSF(分部式高速框架可理解二代Dubbo)俗称:好舒服
- 京东的JSF俗称:惊舒服
- 新浪微博Motan俗称:茅台
- 当当网Dubbox
SpringCloud 是什么?
- 官网:http://spring.io/
- 构建分布式系统不需要复杂且容易出错。Spring Cloud为最常见的分布式系统模式提供了简单易用的编程模型,帮助开发人员构建弹性,可靠和协调的应用程序。
- Spring Cloud构建于Spring Boot之上,使开发人员可以轻松入门并快速提高工作效
率(包括:服务注册/发现,配置中心,全链监控,服务网关,负载均衡,熔断器等等…) - Spring Cloud提供一套分布式的微服务架构一站式的解决方案,说白了,就是各个
微服务架构技术的集合体 - Spring Cloud利用SpringBoot的开发巧妙的简化了分布式系统的基本设施开发,并且
提供了快速的构建分布式系统的一些工具,其中包括(配置管理、服务发现、熔断器、路
由、微代理、事件总线、全局锁、分布式会话等…)
都可以使用SpringBoot的开发风格一键启动和部署 - SpringBoot只是将各个公司比较成熟服务框架结合起来,并通过Spring的风格进行封
装屏蔽了复杂的配置和实现原理,提供一套简单易懂,容易部署与维护的分布式系统开
发工具包
Spring Cloud与Spring Boot的区别
- SpringBoot 还专主于快捷的方便开发单个个体微服务
- SpringCloud是关注全局的微服务协调整框架
- SpringCloud 将Spring Boot开发的一个一个的单体的微服务整合起来从而给各个微服务之间提供(配置管理、服务发现、熔断器、路由、微代理、事件总线、全局锁、分布式会话等…集成服务)
- SpringBoot可以离开SpringCloud独立的进行开发项目,反之SpringCloud是离不
开SpringBoot,是依赖的关系(通俗的说水中可以没有鱼,但是有鱼必须要有水)
Dubbo SpringCloud 的对比
- Spring遗弃了Dubbo的RPC通信,采用了基于HTTP的REST方式
- REST比RPCG更加灵活,服务提供方和调用方的依赖只是需要一纸的协议,不存在代码的级别依赖,在快速的演化的微服务环境下,显得的更加灵活了
- Spring Cloud的功能比Dubbo更加强大,覆盖更加广泛,能够完美的融合SpringData,Spring Boot ,Spring Bacth等等其他的Spring的项目,就如同名牌的电脑做了大量的兼容的测试
- Dubbo就如同组装的电脑什么样的技术都有没有做过兼容测试,总会出现乱七八糟的问题。
- Dubbo在2017.7才重新启动更新对于技术的新需求,都需要开发这自行拓展了如(当当网的DubboX),对于采用微服务架构的中小组织就不合适了没有那么强大的技术进行维护与修改Dubbo的源码以及周边的问题的解决方案
- Dubbo定位于一款RPC的框架,而SpringCloud的目标是微服务架构下的一站式解决的方案,在面临微服务的技术架构下,Dubbo与SpringBoot只能二选一
SpringBoot与SpringCloud本对应关系
Spring Cloud | Spring Boot |
---|---|
Angel版本 | 兼容Spring Boot 1.2.x |
Brixton版本 | 兼容Spring Boot 1.3.x,也兼容Spring Boot 1.4.x |
Camden版本 | 兼容Spring Boot 1.4.x,也兼容Spring Boot 1.5.x |
Dalston版本、Edgware版本 | 兼容Spring Boot 1.5.x,不兼容Spring Boot 2.0.x |
Finchley版本 | 兼容Spring Boot 2.0.x,不兼容Spring Boot 1.5.x |
Greenwich版本 | 兼容Spring Boot 2.1.x |
在实际开发过程中,我们需要更详细的版本对应:
Spring Boot | Spring Cloud |
---|---|
1.5.2.RELEASE | Dalston.RC1 |
1.5.9.RELEASE | Edgware.RELEASE |
2.0.2.RELEASE | Finchley.BUILD-SNAPSHOT |
2.0.3.RELEASE | Finchley.RELEASE |
Spring Cloud的参考文档与官网
- 官网:http://projects.spring.io/spring-cloud/
- 中文参考文档:https://springcloud.cc/spring-cloud-netflix.html
- 英文开发文档:http://cloud.spring.io/spring-cloud-static/Dalston.SR1/
- 中文开发文档:https://springcloud.cc/spring-cloud-dalston.html
- 中国社区:http://springcloud.cn/
- 中文社区:https://springcloud.cc/
SpringCloud添加组件的基本套路
- 新增这个组件的maven坐标GAV
- 在启动类上面标注启动该组件(一般来说是@EnableXXXXX)
- 编写业务逻辑代码
Eureka服务注册与发现
Eureka介绍及原理
理解
Eureka就像一个物业管理公司,其他微服务就像小区的住户,每个住户入住时都要向物业管理公司注册,并定时向物业公司交管理费
介绍
- Eureka是一个基于REST的服务,用于定位服务,以实现云端中间层服务发现和故障转移。
- Eureka主管服务注册与发现,在微服务中,以后了这两者,只需要使用服务的标识符(就是那个在每个服务的yml文件中取得服务名称),就可以访问到服务,不需要修改服务调用的配置文件
- Eureka遵循AP原则(高可用,分区容错性),因为使用了自我保护机制所以保证了高可用
原理
- Eureka使用的是C-S结构(客户端-服务端)
- 两大组件:Eureka Server(提供注册服务)、 Eureka Client(JAVA客户端,负责发送心跳)
- 系统中的其他微服务使用Eureka客户端连接到Eureka服务端维持心跳连接(即注册)。SpringCloud的其他模块可以通过Eureka Server 来发现系统中的微服务并加以调用
Eureka服务注册中心构建
加入服务端依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
配置yml
- 理解:物业公司肯定不向自己注册自己,并肯定知道自己在哪,不用参加检索
server:
port: 7001
eureka:
instance:
hostname: localhost
client:
register-with-eureka: false #false表示不向注册中心注册自己
fetch-registry: false #false表示自己就是注册中心,职责是维护实例,不参加检索
service-url:
defaultZone: http://${
eureka.instance.hostname}:${
server.port}/eureka/ #设置eureka server的交互地址,即对外暴露的地址
添加启动类
注意
:要在类前加@EnableEurekaServer标注
package com.XXX;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class Eureka7001_APP {
public static void main(String[] args) {
SpringApplication.run(Eureka7001_APP.class,args);
}
}
验证是否构建成功
启动主程序,访问该服务地址即可 http://127.0.0.1:7001/
向Eureka注册中心注册微服务
增加依赖
在要注册的微服务的pom.xml文件中增加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
修改yml
- 在application.yml中增加以内容,将客户端注册到服务列表内
- 理解:小区用户要找到物业管理处的地址进行注册
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka
主启动类增加注解
- 增加@EnableEurekaClient注解
@SpringBootApplication
@EnableEurekaClient
public class Provider8001_APP {
public static void main(String[] args) {
SpringApplication.run(Provider8001_APP.class,args);
}
}
actuator与微服务注册完善
主机名称与服务名称的修改
- 修改服务名称,在yml中eureka节点下添加如下内容
eureka:
instance:
instance-id: dept8001 #修改别名
prefer-ip-address: true #显示IP地址
info内容的详细信息修改
作用
在查看Eureka时点击进入某个微服务的info时,能给查看者一些必要的信息,可以帮助查看者快速的了解该微服务,开发中十分有意义。
修改方法
- 当前工程添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
- 总的父工程的build节点下添加如下内容
<build>
<finalName>microservicecloud</finalName>
<resources>
<resource>
<!--允许扫描该路径下的资源文件-->
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<delimiters>
<!--指定动态获取以$标志开头结尾的信息-->
<delimit>$</delimit>
</delimiters>
</configuration>
</plugin>
</plugins>
</build>
- 在当前工程的application.yml文件添加回显信息
info:
author: XXX
build-version: $project.version$
Eureka的自我保护
介绍
Eureka的自我保护机制主要是为了网络异常时保持高可用设计的,当在Eureka中注册的微服务超过设定是时间内(默认90秒)没有向Eureka服务端发送心跳,该微服务会进入自我保护模式。在自我保护模式中,Eureka会保护服务注册表中的信息,不会注销任何服务实例,直至收到的心跳数恢复至阈值以上,该微服务退出自我保护模式。
理解
好死不如赖活:Eureka的设计哲学是宁可保留错误的服务信息,也不盲目注销可能健康的服务。所以异常的服务不会被注销,而是进入了自我保护模式。
自我保护模式的开关
在Eureka Server模块下的yml文件中添加配置信息即可,true表示打开自我保护模式;false表示关闭自我保护模式(不推荐)
server:
enable-self-preservation: false
Eureka的服务发现
介绍
系统中的微服务可以通过Eureka的服务发现去获得在Eureka中注册的服务的信息,这是一个对外暴露的接口。
使用方法(provider中)
- 注入DiscoveryClient 对象(spring包下的),在controller方法中获取
@Autowired
private DiscoveryClient discoveryClient;
@ResponseBody
@GetMapping("/provider/discovery")
public Object discovery(){
List<String> list = discoveryClient.getServices();
System.out.println(list)<