Spring Cloud学习笔记

微服务架构中的两种调用方式:

1、使用HTTP的RESTful API或轻量级的消息发送协议

2、通过在轻量级消息总线上传递消息,类似RabbitMQ等一些提供可靠异步交换的中间件

一、Spring Boot 

1、希望设计大量的自动化配置来简化Spring原有的样板化配置,使开发者可以快速构建应用

2、starter模块简化maven依赖管理

3、Spring Boot 除了能很好的融入Docker之外,其自身就支持嵌入式的tomcat和jetty等容器,只需打成jar包执行 Java -jar命令就能启动一个web应用

4、整个生态系统都用到了Groovy

5、http://start.spring.io/ 自动生成一个spring boot项目

6、spring-boot-starter-web 全栈web开发模块,包含嵌入式tomcat、springmvc

spring-boot-starter-test:通用测试模块,包含Junit、hamcrest、mockito
这里的web和test模块,在boot生态中称为starter POMS

7、spring boot 的配置文件支持被广泛推广的YAML(不是一种标记语言)文件,是一个可读性高,用来表达资料序列的格式,阶梯排列

8、YAML配置文件中的属性可以用@Value("${book.auther}")加载

9、启动应用时可以执行命令修改配置参数是spring boot的一个重要特性,如:java -jar xxx.jar --server.port=8888,可以指定服务启动后对应的端口号

10、实现多环境的多种配置文件,命名格式application-${profile}.yml,在application.yml中配置spring.profiles.active=dev即默认为开发环境

11、starter-actuator的原生端点包括:应用配置类、度量指标类、操作控制类,监控应用信息

二、Spring Cloud Eureka

主要负责完成微服务架构中的服务治理功能,主要用来实现各个微服务实例的自动化注册与发现

1、服务注册中心:Eureka提供的服务端,提供服务注册与发现功能

导入依赖包spring-cloud-starter-eureka-server,在启动类中添加注解@EnableEurekaServer

通过在配置文件中加入配置,来禁用它把自己注册为服务端的功能

eureka.client.register-with-eureka=false 表示是否将自己注册到Eureka Server,默认为true。
eureka.client.fetch-registry=false  表示是否从Eureka Server获取注册信息,默认为true。
eureka.client.serviceUrl.defaultZone :设置与Eureka Server交互的地址,查询服务和注册服务都需要依赖这个地址。默认是http://localhost:8761/eureka ;多个地址可使用 , 分隔

2、服务提供者:可以是spring boot应用,也可以是其它平台遵循spring boot通讯机制的应用,将自己注册到eureka供其它应用发现

导入依赖包spring-cloud-starter-eureka,改造接口注入DiscoveryClient对象,在主类中加上@EnableDiscoveryClient注解

3、服务消费者:消费者应用从服务注册中心获取服务列表,使用Ribbon或Feign实现消费服务的方式

新增引入依赖包spring-cloud-starter-ribbon,在主类中加入注解@EnableDiscoveryClient注册为Eureka客户端应用,在消费者接口类中,加载RestTemplate类并加上@LoadBalanced注解开启客户端负载均衡

三、Spring Cloud Ribbon

基于HTTP和TCP的客户端负载均衡工具,基于Netflix Ribbon实现

1、通过Spring Cloud Ribbon的封装,实现客户端的负载均衡调用非常简单只有如下两步:

(1)服务提供者只需要提供多个服务实例并注册到一个注册中心或多个相关联的服务注册中心

(2)服务消费者直接调用被@LoadBalanced注解修饰过的RestTemplate来实现面向服务的接口调用

实现代码如下:

参数URL:为提供接口服务的地址:IP可用服务名代替+接口地址

请求参数以及响应参数类型

restTemplate.postForObject(url,reqDto,rspObj.getClass());

四、Spring Cloud Hystrix

服务器容错保护,断路器模式:当某个服务单元模块故障时,通过断路器的故障监控,向调用方返回一个错误,而不是一直等待。这样就不会因为调用故障服务线程一直被占用,避免了故障在分布式系统的蔓延;

Hystrix具备服务降级、容错保护、服务熔断、线程和信号隔离、请求缓存、请求合并以及服务监控等功能。

如何实现,需改造consumer项目如下:

1、在pom文件加入依赖starter-hystrix

2、在主类中加入注解@EnableCircuitBreaker或者使用@SpringCloudApplication代替


3、在接口上方加入注解@HystrixCommand(fallbackMethod="helloFallBack"),并定义服务提供者故障后调用的方法helloFallBack


五、Spring Cloud Feign

声明式服务调用,基于Netflix Feign实现,整合Ribbon 和 Hystrix的功能,还提供了一种声明式的web服务客户端定义方式

1、导入依赖包 starter-eureka 和 starter-feign,在消费者主类中加上注解@EnableFeignClients(basePackages="包名")

2、在服务提供者应用中定义接口HelloService,使用@FeignClient("hello-service")注解指定服务名,然后使用SpringMvc注解@RequestMapping("/hello")指定REST接口名

3、参数绑定

4、服务消费者通过依赖服务提供者的service接口,通过interface进行调用

六、Spring Cloud Zuul

API网关服务,类似于Facade模式,进行与业务逻辑无关的校验

1、引入依赖包starter-zuul,其包含了 hystrix、ribbon和actuator

2、在主类中加入注解@EnableZullProxy

3、传统路由配置:

(1)zuul.routes.api-a-url.path=/api-a-url/**

(2)zuul.routes.api-a-url.url=http://localhost:8080/

--

多实例路由配置

(1)zuul.routes.api-a-url.path=/api-a-url/**

(2)zuul.routes.api-a-url.serviceId=hello-service

ribbon.eureka.enable=false

(3)hello-service.ribbon.listOfServers=http://localhost:8080/,http://localhost:8081/

4、面向服务的路由配置

(1)zuul.routes.api-a-url.path=/api-a-url/**

(2)zuul.routes.api-a-url.serviceId=hello-service

(3)eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/

5、请求过滤ZuulFilter

过滤类型filterType,4种生命周期的过滤类型:pre:请求被路由之前调用,routing 在路由请求时被调用,post:在routing和error之后被调用,error:处理请求时发生错误被调用

执行顺序filterOrder:过滤器的执行顺序,数值越小优先级越高

执行条件shouldFilter:返回一个boolean来判断该过滤器是否生效

具体逻辑run:自定义过滤逻辑,是否拦截当前请求不进行路由或者在请求路由返回结果之后,对处理结果进行加工

6、禁用过滤器配置:zuul.<ClassName>.<filterType>.disable=true

zuul总结:(1)做为系统的统一入口,可以屏蔽系统内部各个微服务的细节

(2)可以与服务治理框架结合,实现自动化的服务实例维护以及负载均衡的路由转发

(3)可以实现接口权限校验与微服务业务逻辑的解耦

(4)通过网关服务的过滤器,在各生命周期中去校验内容,将原本在对外服务层做的校验迁移,保证了微服务的无状态性,降低微服务的测试难度,本身更集中业务逻辑

七、Spring Cloud Config

1、构建配置中心:

(1)导入依赖spring-cloud-config-server

(2)在主类中加入注解@EnableConfigServer

(3)在application.properties配置git仓库信息,使用git管理配置内容的分布式配置中心

2、客户端配置映射:

(1)加入依赖spring-cloud-starter-config

(2)新建bootstrap.properties来指定获取配置文件的配置中心

(3)可以通过@Value("${name}")注解获取相应配置,或者通过Environment的getProperty("name")方法获取指定配置

每次客户端请求获取配置信息时,配置中心先会获取git仓库配置到本地,然后在本地git仓库中读取并返回;当远程仓库无法读取时,直接读取本地并返回

3、服务端详解:

(1)应用启动时,根据bootstrap配置的应用名、环境名、分支名,向服务配置中心请求获取配置信息

(2)服务配置中心根据配置的git仓库信息,和客户端请求的信息获取对应的配置信息

(3)服务端通过git clone命令将找到的配置信息down到本地

(4)服务配置中心创建Spring的applicationContext实例,并从本地git仓库中加载配置文件,最后将配置信息返回给客户端

(5)客户端应用获取到外部配置文件后加载到客户端的ApplicationContext实例,该配置内容的优先级高于客户端jar包内部的配置内容,所以在jar包中重复的内容将不被加载



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值