第一章 基础知识
1.什么是微服务:
微服务是系统架构上的一种设计风格;
它的主旨是讲一个原本独立的系统拆分成多个小型服务;
服务之间通过基于HTTP的RESTful API进行通信协作;
2.微服务存在的问题:
#运维的新挑战
在微服务架构中,运维人员需要维护的进程数量会大大增加。
#接口的一致性
虽然我们拆分了服务,但是业务逻辑上的依赖并不会消除,
只是从单体应用中的代码依赖变为了服务间的通信依赖。
#分布式的复杂性
需要考虑:网络延迟、分布式事务、异步消息等;
3.微服务架构的九大特性:
服务组件化;
按业务组织团队;
做“产品”的态度;
智能端点与哑管道;
去中心化治理;
去中心化管理数据;
基础设施自动化;
容错设计;
演进式设计;
4.SpringCloud简介:
SpringCloud是一个基于SpringBoot实现的微服务架构开发工具。
第二章 SpringBoot
SpringBoot starter
SpringBoot出现的宗旨并非要重写Spring或是替代Spring,而是希望通过设计大量的自动化配置等方式来简化Spring原有样板化的配置,是得开发者可以快速构建应用;
除了解决配置问题外,SpringBoot还通过一系列Starter POMs的定义,让我们整合各项功能的时候,不需要在Maven的pom.xml文件中维护那些错综复杂的依赖关系,而是通过类似模块化的Starter模块定义来引用,使得依赖管理工作变得更为简单;
SpringBoot的Starter POMs采用 spring-boot-starter-*的命名方式,*代表一个特别的应用功能模块
SpringBoot的打包方式
SpringBoot默认将Web应用打包为jar形式,而非war的形式;
SpringBoot除了可以更好融入Docker之外,其自身就支持嵌入式的Tomcat等容器。所以通过SpringBoot构建的应用不需要安装Tomcat、将应用打包成war、再部署到Tomcat这样复杂的构建与部署工作,只需将SpringBoot应用打成jar包,通过java -jar命令直接运行就能启动一个标准化的Web应用;
实现RESTful API
在SpringBoot中创建一个RESTful API的实现代码同SpringMVC应用一样,只是不需要像SpringMVC那样先做很多配置,而是可以直接编写Controller内容。
SpringBoot的配置文件
1.application.properties
SpringBoot的配置目录是:src/main/resources
SpringBoot的默认配置文件是:src/mian/resources/application.properties
关于SpringBoot应用的配置内容都可以集中在该文件中,根据我们引入的不同starter模块,可以在这里定义:容器端口号、数据库连接信息、日志级别等各种配置信息;
2.YAML
SpringBoot的配置文件还支持现在被广泛推荐使用的YAML文件。
YAML强调以数据为中心,而不是以标记语言为中心。
YAML以类似大纲的缩进形式来表示,配置信息利用阶梯化缩进的方式,其结构更为清晰易读,同时配置内容的字符量也得到显著减少。
3.自定义参数
也可以在配置文件中定义一些我们需要的自定义属性。
然后在应用中可以通过@Value注解来加载这些自定义的参数
4.多环境配置
application-dev.properties 开发
application-test.properties 测试
application-prod.properties 生产
监控与管理
spring-boot-starter-actuator
引入该模块能够自动为SpringBoot构建的应用提供一系列用于监控的端点。
第三章 SpringCloud Eureka
关于:微服务治理
主要负责完成微服务架构中的服务治理功能;
服务治理可以说是微服务架构中最为核心和基础的模块,它主要用来实现各个微服务实例的自动注册与发现;
服务注册:在微服务治理框架中,通常都会构建一个注册中心,每个微服务单元向注册中心登记自己提供的服务;
服务发现:服务间的调用不再通过指定具体的实例地址来实现,而是通过向服务名发起请求调用实现;调用方需要向服务注册中心咨询服务,并获取所有服务的实例清单,以实现对具体服务实例的访问;
使用Eureka来实现服务注册与发现;
Eureka包含:服务端组件、客户端组件;
Eureka服务端:也称为:服务注册中心,同其他服务注册中心一样,支持高可用配置;
Eureka客户端:主要处理服务的注册与发现;
客户端服务通过注解和参数配置的方式,嵌入在客户端应用程序的代码中,在应用程序运行时,Eureka客户端向注册中心注册自身提供的服务并周期性地发送心跳来更新它的服务租约。同时,它也能从服务端查询当前注册的服务信息并把它们缓存到本地并周期性地刷新服务状态;
搭建服务注册中心
1. 创建SpringBoot工程命名为:eureka-server;
2. 在pom.xml中引入依赖:spring-cloud-eureka-server;
3. 通过 @EnableEurekaServer注解 启动一个服务注册中心提供给其他应用进行对话;
注意:在默认设置下,该服务注册中心也会将自己作为客户端来尝试注册它自己,所以我们需要进制它的客户端注册行为:在application.properties中:eureka.client.register-with-eureka=false;
注册服务提供者
在完成服务注册中心的搭建之后,接下来我们尝试将一个既有的springboot应用加入Eureka的服务治理体系中去。
1. 在pom.xml中添加依赖:spring-cloud-starter-eureka;
2. 改造/hello请求处理接口,通过注入DiscoveryClient对象,在日志中打印出服务的相关内容;
3. 在主类中通过加上 @EnableDiscoveryClient注解,激活Eureka中的DiscoveryClient实现;
4. 在application.properties中,通过:spring.application.name属性来为服务命名,比如命名为:hello-service;
再通过:eureka.client.serviceUrl.defaultZone属性 来指定服务注册中心的地址;
服务发现与消费
构建服务消费者。
服务发现:由Eureka的客户端完成;
服务消费:由Ribbon完成;
1. 启动之前实现的服务注册中心eureka-server,以及hello-service服务;
2. 创建一个springboot工程来实现服务消费者,取名为:ribbon-consumer;
在pom.xml总添加依赖:spring-cloud-starter-eureka,spring-cloud-starter-ribbon;
3. 创建应用主类ConsumerApplication,通过 @EnableDiscoveryClient注解让该应用注册为Eureka客户端应用,以获得服务发现能力;
同时,在该主类中创建RestTemplate的SpringBoot实例,并通过@LoadBalanced注解开启客户端负载均衡;
4. 创建ConsumerController类并实现/ribbon-consumer接口;
在该接口中,通过上面创建的RestTemplate来实现对HELLO-SERVICE服务提供的/hello接口进行调用;
可以看到这里访问的地址是服务名HELLO-SERVICE,而不是一个具体的地址;
5. 在application.properties中配置Eureka服务注册中心的位置,需要与之前的HELLO-SERVICE一样,不然是发现不了该服务的;
6. 启动ribbon-consumer应用;
总结
Eureka服务治理基础架构三个核心要素:
1)服务注册注册中心
服务注册
服务同步
服务续约
2)服务提供者
获取服务
服务调用
服务下线
3)服务消费者
失效剔除
自我保护
第4章 SpringCloud Ribbon:客户端负载均衡
SpringCloud Ribbon
SpringCloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具;
可以轻松地将面向服务的REST模板请求自动转换成客户端负载均衡的服务调用;
它几乎存在于每一个SpringCloud构建的微服务和基础设施中,包括Feign也是基于Ribbon实现的工具;
客户端负载均衡与服务端负载均衡最大的不同点在于服务清单所存储的位置,所有客户端节点都维护着自己要访问的服务端清单,而这些服务清单来自于服务注册中心,比如Eureka服务端;客户端负载均衡也需要心跳去维护自己要访问的服务清单的健康性,只是这个步骤需要与服务注册中心配合完成;
RestTemplate
spring框架提供的RestTemplate类可用于在应用中调用rest服务,它简化了与http服务的通信方式,统一了RESTful的标准,封装了http链接, 我们只需要传入url及返回值类型即可。相较于之前常用的HttpClient,RestTemplate是一种更优雅的调用RESTful服务的方式。
RestTemplate针对几种不同请求类型和参数类型的服务的调用实现:
GET请求:
第一种:getForEntity()
第二种:getForObject()
POST请求:
第一种:postForEntity()
第二种:postForObject()
第三种:postForLocation()
PUT请求:
put()
DELETE请求:
delete()
负载均衡器
在具体实现客户端负载均衡的时候,是通过Ribbon的ILoadBalancer接口实现的;
以下是ILoadBalancer接口的实现类:
AbstractLoadBalancer;
BasedLoadBalancer 类是Ribbon负载均衡器的基础实现类,在该类中定义了很多关于负载均衡相关的基础内容;
DynamicServerListLoadBalancer 类继承于 BasedLoadBalancer类,它是基础负载均衡器的扩展;
第6章 SpringCloud Feign:声明式服务调用
Feign简介:
Feign是基于Ribbon和Hystrix的声明式服务调用组件、一种声明式HTTP客户端;
我们在使用Ribbon时,通常都会利用它对RestTemplate的请求拦截来实现对依赖服务的接口调用,而RestTemplate已经实现了对HTTP请求的封装处理,形成了一套模板化的调用方法。Feign在此基础上进一步封装,由它来帮助我们定义和实现依赖服务接口的定义,即可完成对服务提供方的接口绑定,简化了在使用Ribbon时自行封装服务调用客户端的开发量;
创建步骤:
1. 创建SpringBoot工程,命名为:feign-consumer,
在pom.xml中引入spring-cloud-starter-eureka和spring-cloud-starter-feign依赖;
2. 创建应用主类ConsumerApplication,并通过@EnableFeignClients注解开启SpringCloud Feign的支持功能;
3. 定义HelloService接口,通过@FeignClient注解指定服务名来绑定服务,然后再使用SpringMVC的注解来绑定具体该服务提供的REST接口;
4. 创建一个ConsumerController来实现对Feign客户端的调用;使用@Autowired直接注入上面定义的HelloService实例,然后调用;
5. 最后,同Ribbon实现的消费者一样,需要在application.properties中指定服务注册中心,并定义自身的服务名为feign-consumer