Open eziceice opened 5 years ago
Eureka architecture:
spring.application.name
的值。DiscoveryManager.getInstance().shutdownComponent();
choose()
方法来选择一个服务实例。LoadBalancerClient也可以不从Eureka Client获取注册列表信息,这时需要自己维护一份服务注册列表信息。initWithNiwsConfig
方法。value()
和name()
是一样的,是被调用的服务的ServiceId。url()
是直接填写硬编码的URL地址。decode404()
即404是被解码,还是直接抛出异常。configuration()
指明FeignClient的配置类,默认为FeignClientsConfiguration
,这个类默认注入了Decoder,Encoder和Contract等配置的Bean。fallback()
为配置熔断器的处理类。metrics.rollingStats.timeInMilliseconds
(default 10000), the percentage of actions resulting in a handled exception exceeds errorThresholdPercentage
(default 50), provided also that the number of actions through the circuit in the timespan is at least requestVolumeThreshold
(default 3)。hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds=50000
),并将一定数量的请求执行正常逻辑,剩余的请求会执行快速失败。若执行正常逻辑的请求失败了,则熔断器继续打开。若成功了,则将熔断器关闭,这样熔断器就具有了自我恢复的能力。hystrix.command.default.execution.isolation.strategy=SEMAPHORE
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=10000
hystrix.command.default.fallback.enabled=true
hystrix.command.default.circuitBreaker.enabled=true
hystrix.command.default.circuitBreaker.requestVolumeThreshold=3
hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds=50000
hystrix.command.default.circuitBreaker.errorThresholdPercentage=50
FallbackProvider
接口,可以让Zuul包含有熔断的功能(使用Hystrix),该接口有两个方法:
getRoute()
用于指定熔断功能应用于那些路由的服务,通常返回ServiceId
来对某个服务进行熔断,返回*
可以对所有的微服务都进行熔断。fallbackResponse()
为进入熔断功能时执行的逻辑。ZuulFilter
并实现其中的抽象方法便可以实现过滤器。setSendZuulResposne
方法设置为true, 则将请求分发到具体的服务实例。如果是false,则不分发到具体的微服务实例,默认是true。/actuator/bus-refresh
由于服务单元数量众多,业务的复杂性较高,如果出现了错误和异常,很难去定位。主要体现在一个请求可能需要调用很多个服务,而内部服务的调用复杂性决定了问题难以定位。所以在微服务框架中,必须实现分布式链路追踪,去跟进一个请求到底有哪些服务的参与,参与的顺序又是怎么样的,从而达到每个请求的步骤都清晰可见,出了问题能够快速定位的目的。
Span:基本的工作单元,发送一个远程调度任务就会产生一个Span,Span是一个64位ID唯一标识的,Trace是用另外一个64位ID唯一标识的。Span还包含了其他信息,例如摘要,时间戳时间,Span的ID和进程ID。
Trace:由一系列的Span组成的,呈树状结构。请求一个微服务系统的API接口,这个API接口需要调用多个微服务单元,调用每一个微服务单元都会产生一个新的Span,所有由这个请求产生的Span组成了这个Trace。
Annotation:用于记录一个事件,一些核心注解用于定义一个请求的开始和结束,这些注解如下:
Spring Cloud目前已经不支持单独构建Zipkin服务器,可以从https://zipkin.io/pages/quickstart下载Zipkin并且直接运行。
通常使用ElasticSearch和Kibana对Tracing Log进行持久化和分析。
启动Zipkin时搭配一些customized jvm properties便可使Zipkin连接到Message Queue或者Elastic Search服务器。
INFO [gateway-service,d102b1cce1e5427e,d102b1cce1e5422e,true]
WebSecurityConfigurerAdapter
类使用@EnableGlobalMethodSecurity(prePostEnabled = true)
可以开启方法级别的保护。该注解有三个properties:
prePostEnabled
:@PreAuthorize
和@PostAuthorize
是否可用。secureEnabled
:@Secured
注解是否可用。jsr250Enabled
:Spring Security对JSR-250的注解是否可用。prePostEnabled
,因为@PreAuthorize
和@PostAuthorize
注解更适合方法级别的安全控制,并且支持Spring EL表达式,适合Spring开发者。其中@PreAuthorize
注解会在进入方法前进行权限验证,@PostAuthorize
注解会在方法执行后再进行权限验证(应用场景很少)。
@PreAuthorize("hasRole('ADMIN')")
@PreAuthorize("hasAuthority('ROLE_ADMIN')")
@PreAuthroize("hasAnyRole('ADMIN', 'USER')")
@PreAuthorize("hasAnyAuthority('ROLE_ADMIN', 'ROLE_USER')")
AuthorizationServerConfigurer
接口的类上加@EnableAuthorizationServer
注解,就可以开启Authorization Server的功能,其中以下三个config为必须实现。
ClientDetailsServiceConfigurer
:配置Client的信息。
AuthorizationServerEndpointsConfigurer
:配置授权token的endpoint和token service。
AuthorizationServerSecurityConfigurer
:如果资源服务和授权服务是同一个服务器,则使用默认的配置即可。如果不在同一个服务器,则需要做一些额外设置。如果采用RemoteTokenServices(远程验证Token),资源服务器每次请求所携带的Token都需要从授权服务器做验证。这时需要配置/oauth/validateToken
节点。
1. Basic
Spring Cloud是一套组件,包含服务发现,配置中心,消息总线,负载均衡,断路器和数据监控等。
Eureka - 服务治理和发现
@EnableEurekaServer
来开启Eureka Service。(和SpringBoot Application的启动方法一致)。eureka.client.serviceUrl.defaultZone
:代表服务中心的域,将来可以提供给别的microservice进行注册。eureka.client.register-with-eureka
:默认情况下为true,项目会自动查找Eureka的server去注册。Server本身则不需要,设为false。@EnableDiscoveryClient
,因此不需要再显示的使用此Annotation。spring.application.name
相同,因为Eureka Server是通过microservice的名字来判断是否是新的节点的。eureka.client.serviceUrl.defaultZone
),可以实现多个服务治理中心。同时通过在client端添加多个服务治理中心,可以实现多个client节点注册多个服务治理中心。Ribbon & Feign - 微服务之间的调用
Ribbon
@LoadBalance
注解(初始化RestTemplate时)就可以使用负载均衡算法,降低单个endpoint的压力。Feign
Hystrix - 断路器
Zuul - 路由网关
Filter
shouldFilter
:返回boolean值,如果为true则执行过滤器的run方法。run
:运行过滤逻辑,过滤器的核心方法。filterType
:过滤器类型,通过返回一个字符串来配置过滤器运行时机。filterOrder
:指定过滤器顺序,值越小越优先。@SprngCloudApplication
@SpringCloudApplication
,整合了以下三个Annotation@SpringBootApplication
@EnableDiscoverClient
@EnableCircuitBreaker