SpringBoot:是一个快速开发的框架,能够快速的整合第三方框架,简化XML配置,全部采用注解形式,内置Tomcat容器,帮助开发者能够实现快速开发,SpringBoot的Web组件默认集成的是SpringMVC框架(SpringMVC是控制层)。要求JDK1.8以上,SpringFramework 4.1.5以上。
渲染Web页面:使用模板引擎,有:Thymeleaf、FreeMarker、Velocity、Groovy、Mustache
SpringBoot相关注解:
@ExceptionHandler
: 表示拦截异常;- **@RestController:**在上加上RestController 表示修饰该Controller所有的方法返回JSON格式,直接可以编写Restful接口;
- @EnableAutoConfiguration:作用在于让 Spring Boot 根据应用所声明的依赖来对 Spring 框架进行自动配置,这个注解告诉Spring Boot根据添加的jar依赖猜测你想如何配置Spring;
- @Transactional:SpringBoot默认集成事务;
- ****@Scheduled:****创建定时任务
- @EnableAsync、@Async:使用多线程技术
SpringBoot多数据源事务管理:使用jta+atomikos 进行分布式事务管理。在Spring Boot应用中使用JTA和Atomikos时,通常是因为你的应用需要同时访问多个数据源,例如多个数据库,在这种情况下,你希望所有的数据库操作要么全部成功提交,要么全部回滚,以确保数据的一致性。
Devtools工具: 依赖spring-boot-devtools,深层原理是使用了两个ClassLoader,一个Classloader加载那些不会改变的类(第三方Jar包),另一个ClassLoader加载会更改的类,称为 restart ClassLoader ,这样在有代码更改的时候,原来的restart ClassLoader 被丢弃,重新创建一个restart ClassLoader,由于需要加载的类相比较少,所以实现了较快的重启时间(5秒以内)。
Actuator :是spring boot的一个附加功能,可帮助你在应用程序生产环境时监视和管理应用程序,spring-boot-starter-actuator。Client客户端集成了Actuator,然后把收集到的信息注册到Admin-UI平台上。客户端配置如下:
spring:
boot:
admin:
client:
url: http://localhost:8080
server:
port: 8081
management:
endpoints:
web:
exposure:
include: "*"
endpoint:
health:
show-details: ALWAYS
SpringBoot的优化建议:组件扫描(移除 @SpringBootApplication 和 @ComponentScan,在需要的bean上进行配置),替换内置的tomcat为undertow,JVM的大小配置(Xms :设置Java堆栈的初始化大小、-Xmx :设置最大的java堆大小)
SpringBoot核心原理:无配置文件(纯Java)完全注解化+内置tomcat-embed-core实现SpringBoot框架,Main函数启动,Maven继承依赖关系,采用SpringMVC注解版本实现无配置效果(Spring 3引入了注解)
SpringBoot多配置文件:• bootstrap.yml
先加载application.yml
后加载。bootstrap.yml 用来程序引导时执行,应用于更加早期配置信息读取。application.yml 可以用来定义应用级别的, 应用程序特有配置信息,可以用来配置后续各个模块中需使用的公共参数等。
- application-demo.yml(本地环境下的配置)
- application-dev.yml(开发环境下的配置)
- application-local.yml(本地环境下的配置)
- application-test.yml(测试环境下的配置)
- application-prod.yml(生产环境下的配置)
- bootstrap-demo.yml(本地环境下的配置,boostrap加载优于application)
- bootstrap-dev.yml(开发环境下的配置,boostrap加载优于application)
- bootstrap-local.yml(本地环境下的配置,boostrap加载优于application)
- bootstrap-test.yml(测试环境下的配置,boostrap加载优于application)
- bootstrap-prod.yml(生产环境下的配置,boostrap加载优于application)
**SpringBoot WebMvcConfigurer接口:WebMvcConfigurerAdapter
和 WebMvcConfigurer
是用于配置Spring MVC的接口或类。在较新的Spring版本中,WebMvcConfigurerAdapter
已被废弃,而推荐使用 WebMvcConfigurer
接口进行配置。
WebMvcConfigurerAdapter
是一个类,可以通过继承并覆盖需要的方法来进行配置。这提供了一种类似于模板方法模式的方式,允许开发者只关注自己感兴趣的配置项。WebMvcConfigurer
是一个接口,开发者需要实现接口中的方法,这可能导致需要实现一些不感兴趣的方法。但通过Java 8引入的默认方法,接口可以提供一些默认的实现,从而降低了实现该接口时的工作量。
@Configuration
public class WebConfig implements WebMvcConfigurer {
/** * 添加类型转换器和格式化器 * @param registry */
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addFormatterForFieldType(LocalDate.class, new USLocalDateFormatter());
}
/** * 跨域支持 * @param registry */
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowCredentials(true)
.allowedMethods("GET", "POST", "DELETE", "PUT")
.maxAge(3600 * 24);
}
/** * 添加静态资源--过滤swagger-api (开源的在线API文档) * @param registry */
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
//过滤swagger
registry.addResourceHandler("swagger-ui.html")
.addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**")
.addResourceLocations("classpath:/META-INF/resources/webjars/");
registry.addResourceHandler("/swagger-resources/**")
.addResourceLocations("classpath:/META-INF/resources/swagger-resources/");
registry.addResourceHandler("/swagger/**")
.addResourceLocations("classpath:/META-INF/resources/swagger*");
registry.addResourceHandler("/v2/api-docs/**")
.addResourceLocations("classpath:/META-INF/resources/v2/api-docs/");
}
}
/** * 配置消息转换器--这里我用的是alibaba 开源的 fastjson * @param converters */
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
//1.需要定义一个convert转换消息的对象;
FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
//2.添加fastJson的配置信息,比如:是否要格式化返回的json数据;
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat,
SerializerFeature.WriteMapNullValue,
SerializerFeature.WriteNullStringAsEmpty,
SerializerFeature.DisableCircularReferenceDetect,
SerializerFeature.WriteNullListAsEmpty,
SerializerFeature.WriteDateUseDateFormat);
//3处理中文乱码问题
List<MediaType> fastMediaTypes = new ArrayList<>();
fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
//4.在convert中添加配置信息.
fastJsonHttpMessageConverter.setSupportedMediaTypes(fastMediaTypes);
fastJsonHttpMessageConverter.setFastJsonConfig(fastJsonConfig);
//5.将convert添加到converters当中.
converters.add(fastJsonHttpMessageConverter);
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new ReqInterceptor()).addPathPatterns("/**");
}
}
SpringCloud:是一套目前非常完整的微服务解决方案框架,其内容包含服务治理、注册中心、配置管理、断路器、智能路由、微代理、控制总线、全局锁、分布式会话等SpringCloud包含众多的子项目。例如:
- Eureka(音标:[/juˈriːkə]):服务治理 注册中心
- Hystrix(音标: [hɪst’rɪks]):服务保护框架
- Ribbon(音标:[ˈrɪbən]):客户端负载均衡器
- Feign(音标:[feɪn]):基于ribbon和hystrix的声明式服务调用组件
- Zuul(音标:祖尔): 网关组件,提供智能路由、访问过滤等功能。
Eureka服务消费模式以及服务注册模式:
-
服务消费者模式:
获取服务:消费者启动的时候,使用服务别名,会发送一个rest请求到服务注册中心获取对应的 服务信息,然后会缓存到本地jvm客户端中,同时客户端每隔30秒从服务器上更新一次) 服务下线:服务实例过正常的关闭操作时,它会触发一个服务下线的REST请求给Eureka Server, 服务端在接收到请求之后,将该服务状态置为下线(DOWN)
-
服务注册模式:
失效剔除:客户端非正常下线,Eureka Server 在启动的时候会创建一个定时任多默认每隔一段时间(默认为60秒)将当前清单中超时(默认为90秒)没有续约的服务除出去; 自我保护:EurekaServer在一定时间内没有收到EurekaClient发送的心跳,便会把该实例从注册服务列表中剔除(默认是90秒),但是在短时间内丢失大量的实例心跳,这时候EurekaServer会开启自我保护机制,Eureka不会踢出该服务。
服务端核心配置:
server:
# 测试时关闭自我保护机制,保证不可用服务及时踢出
enable-self-preservation: false
##剔除失效服务间隔
eviction-interval-timer-in-ms: 2000
客户端核心配置:
# 心跳检测检测与续约时间
# 测试时将值设置设置小些,保证服务关闭后注册中心能及时踢出服务
instance:
###Eureka客户端向服务端发送心跳的时间间隔,单位为秒(客户端告诉服务端自己会按照该规则)
lease-renewal-interval-in-seconds: 1
####Eureka服务端在收到最后一次心跳之后等待的时间上限,单位为秒,超过则剔除(客户端告诉服务端按照此规则等待自己)
lease-expiration-duration-in-seconds: 2
Eureka替代方案:Consul、Eureka、Nacos等。Zookeeper保证的是CP(master挂了,选举需要时间,期间导致注册不可用), 而Eureka则是AP(与zk不一样,各个节点都是平等的,剩余节点依然可以提供服务注册)。
Nacos:是一个用于服务发现、配置管理和服务治理的开源平台。Eureka已经停止维护了,建议使用Nacos。除了服务注册和发现,Nacos 还提供了配置管理的功能。提供了更广泛的兼容性,可以在容器化环境和传统的虚拟机环境中使用。
CAP理论:
- “C”是指一致性(Consistency): 即当一个Process(过程)修改了某个数据后,其他Process读取这是数据是,得到的是更新后的数据,但并不是所有系统都 可以做到这一点。例如,在一些并非严格要求一致性的系统中,后来的Process得到的数据可能还是修改之前的数据,或者需要等待一定时间后才能得到修改之后的数据,这被成为“弱一致性”,最经典的应用就是DNS系统。当用户修改了DNS配置后,往往不会马上在全网更新,必定会有一个延迟,这个延迟被称为 “不一致窗口”,它的长度取决于系统的负载、冗余的个数等因素。但对于某些系统而言,一旦写入,后面读取的一定是修改后的数据,如银行账户信息,这被称为 “强一致性”。
- “A”是指可用性(Availability): 即系统总是能够为用户提供连续的服务能力。当用户发出请求是,系统能给出响应(成功或者失败),而且是立即给出响应,而不是等待其他事情完成才响应。如果需要等待某件事情完成才响应,那么“可用性”就不存在了。
- “P”是指容错性(Partition tolerance): 任何一个分布式计算系统都是由多个节点组成的。在正常情况下,节点与节点之间的通信是正常的。但是在某些情况下,节点之间的通信会 断开,这种断开成为“Partition”。在分布式计算的实现中,Partition是很常见的,因为节点不可能永远不出故障,尤其是对于跨物理地区的 海量存储系统而言,而容错性则可以保证如果只是系统中的部分节点不可用,那么相关的操作仍旧能够正常完成。
Ribbon负载均衡器:Ribbon是从eureka注册中心服务器端上获取服务注册信息列表,缓存到本地,然后在本地实现轮训负载均衡策略(客户端转发)。@LoadBalanced注解。nginx是服务端的负载均衡、ribbon是本地的负载均衡器。
@SpringBootApplication
@EnableEurekaClient
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
@Bean
//@LoadBalanced
//@LoadBalanced就能让这个RestTemplate在请求时拥有客户端负载均衡的能力(增加@LoadBalanced,就不能使用127.0.0.1,只能使用应用名)
RestTemplate restTemplate() {
return new RestTemplate();
}
}
服务保护相关概念:
- 服务雪崩:服务雪崩效应产生于服务堆积在同一个线程池中,因为所有的请求都是同一个线程池进行处理,这时候如果在高并发情况下,所有的请求全部访问同一个接口,这时候可能会导致其他服务没有线程进行接受请求,这就是服务雪崩效应效应;
- 服务降级:在高并发情况下,防止用户一直等待,使用服务降级方式(直接返回一个友好的提示给客户端,调用fallBack方法);
- 服务熔断:熔断机制目的为了保护服务,在高并发的情况下,如果请求达到一定极限(可以自己设置阔值)如果流量超出了设置阈值,让后直接拒绝访问,保护当前服务。使用服务降级方式返回一个友好提示,服务熔断和服务降级一起使用;
- 服务隔离:因为默认情况下,只有一个线程池会维护所有的服务接口,如果大量的请求访问同一个接口,达到tomcat 线程池默认极限,可能会导致其他服务无法访问。使用服务隔离机制(线程池方式和信号量)。使用线程池方式实現隔离的原理,相当于每个接口(服务)都有自己独立的线程池,因为每个线程池互不影响,这样的话就可以解决服务雪崩效应。
- 服务限流:对接口访问进行限制,常用服务限流算法令牌桶、漏桶,计数器也可以进行粗暴限流实现。
Hystrix:主要用来解决服务雪崩的问题。如果某个接口出现了问题导致阻塞,多个请求一起访问,会导致整个系统崩溃。所以就提出了断路器解决服务雪崩这一个问题。使用的技术有“资源隔离(线程池和信号量隔离)”、“降级机制(超时、资源不足时降级)”、“熔断(失败率达到阈值自动触发降级)”、“缓存”。可以使用Turbine做Hystrix的监控。
// 配置Hystrix断路器
feign:
hystrix:
enabled: true
// hystrix禁止服务超时时间
hystrix:
command:
default:
execution:
timeout:
enabled: false
-------------------------
// 开启Hystrix断路器
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
@EnableHystrix
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
----------------------------
// 业务层代码
@RestController
public class ServiceBController {
@Autowired
private RestTemplate restTemplate;
@RequestMapping("/getOrder")
public String getOrder() {
// order 使用rpc 远程调用技术 调用 会员服务
String memberUrl = "http://app-service-a/getMember";
String result = restTemplate.getForObject(memberUrl, String.class);
System.out.println("会员服务调用订单服务,result:" + result);
return result;
}
@HystrixCommand(fallbackMethod = "orderToUserInfoFallback")
@RequestMapping("/getUserInfoHystrix")
public String orderToUserInfoHystrix() {
System.out.println("orderToUserInfo:" + "当前线程池名称:" + Thread.currentThread().getName());
return getOrder();
}
@RequestMapping("/orderToUserInfoFallback")
public String orderToUserInfoFallback() {
return "系统错误!!!!";
}
}
Feign客户端:是一个web声明式HTTP远程调用工具,提供了接口和注解方式进行调用。Feign客户端Http调用工具,默认已经整合了Ribbon负载均衡客户端和Eureka。
使用方式:启动类@EnableFeignClients、定义接口@FeignClient
SpringCloud Config:是分布式配置中心框架的其中一种,可以实现微服务中的所有系统的配置文件的统一管理,而且还可以实现当配置文件发生变化的时候,系统会自动更新获取新的配置。常用的分布式配置中心框架有:
- Disconf(依赖于zookpeer,百度研发)
- Zookpeer(保证配置文件信息实时更新 -事件通知)
- diamond(阿里巴巴研发)
- Apollo阿波罗(携程研发)
- Redis
- xxl-conf
SpringColud Config的原理:
Zuul:一个基于JVM的网关服务,用于构建微服务架构中的边缘服务。它是一个反向代理,充当了服务网关的角色,负责处理客户端请求、路由请求到不同的微服务、执行一些过滤操作,同时还可以提供负载均衡、安全认证、监控等功能。
Nginx与Zuul的区别:
- Nginx是采用服务器负载均衡进行转发
- Zuul依赖Ribbon和eureka实现本地负载均衡转发
- 相对来说Nginx功能比Zuul功能更加强大,能够整合其他语言比如lua脚本实现强大的功能,同时Nginx可以更好的抗高并发,Zuul网关适用于请求过滤和拦截等。
zuul:
routes:
service1:
path: /service1/** serviceId: service1 service2: path: /service2/** serviceId: service2
Dubbo:是一个分布式服务框架,提供高性能和透明化的 RPC 远程服务调用方案,以及 SOA 服务治理方案
调用流程:
- 服务容器负责启动,加载,运行服务提供者。
- 服务提供者在启动时,向注册中心注册自己提供的服务。
- 服务消费者在启动时,向注册中心订阅自己所需的服务。
- 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
- 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
- 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
SpringCloud与Dubbo的区别:
- 相同点:SpringCloud 和Dubbo可以实现RPC远程调用框架,可以实现服务治理。
- 不同点:如果学习Dubbo的话,学习其他的分布式解决方案需要自己组装,反而如果学习SpringCloud,它已经把整个常用分布式解决都整合好了。
SpringCloud消息总线(Spring Bus):将分布式的节点用轻量的消息代理连接起来,可以很容易搭建消息总线,它广播的消息会被所有在注册中心的微服务实例监听和消费。
SpringCloud消息驱动(Spring Stream):简化开发人员对消息中间件的使用复杂度,让系统开发人员更多尽力专注与核心业务逻辑的开发。目前只支持RabbitMQ(maven引入spring-cloud-starter-stream-rabbit)和Kafka(maven引入spring-cloud-starter-stream-kafka)
- Source: 当需要发送消息时,我们就需要通过Source,Source将会把我们所要发送的消息(POJO对象)进行序列化(默认转换成JSON格式字符串),然后将这些数据发送到Channel中;
- Sink: 当我们需要监听消息时就需要通过Sink来,Sink负责从消息通道中获取消息,并将消息反序列化成消息对象(POJO对象),然后交给具体的消息监听处理进行业务处理;
- Channel: 消息通道是Stream的抽象之一。通常我们向消息中间件发送消息或者监听消息时需要指定主题(Topic)/消息队列名称,但这样一旦我们需要变更主题名称的时候需要修改消息发送或者消息监听的代码,但是通过Channel抽象,我们的业务代码只需要对Channel实现就可以了,具体这个Channel对应的是那个主题,就可以在配置文件中来指定,这样当主题变更的时候我们就不用对代码做任何修改,从而实现了与具体消息中间件的解耦;
- Binder: Stream中另外一个抽象层。通过不同的Binder可以实现与不同消息中间件的整合,比如上面的示例我们所使用的就是针对Kafka的Binder,通过Binder提供统一的消息收发接口,从而使得我们可以根据实际需要部署不同的消息中间件,或者根据实际生产中所部署的消息中间件来调整我们的配置。
SpringSecurity:一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。Spring Security提供有若干个过滤器,它们能够拦截Servlet请求,并将这些请求转给认证和访问决策管理器处理,从而增强安全性。Security在很多企业中作为后台角色有很多,如:
- 权限框架
- 授权认证oauth2.0
- 安全防护(防止跨站点请求)
- Session攻击
- 易于融合SpringMVC
- 。。。
// Security 配置
@Component
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private MyAuthenticationFailureHandler failureHandler;
@Autowired
private MyAuthenticationSuccessHandler successHandler;
// 配置认证用户信息和权限
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
// 添加admin账号
auth.inMemoryAuthentication().withUser("admin").password("123456").
authorities("showOrder","addOrder","updateOrder","deleteOrder");
// 添加userAdd账号
auth.inMemoryAuthentication().withUser("userAdd").password("123456").authorities("showOrder","addOrder");
// 如果想实现动态账号与数据库关联 在该地方改为查询数据库
}
// 配置拦截请求资源
protected void configure(HttpSecurity http) throws Exception {
// 如何权限控制 给每一个请求路径 分配一个权限名称 让后账号只要关联该名称,就可以有访问权限
http.authorizeRequests()
// 配置查询订单权限
.antMatchers("/showOrder").hasAnyAuthority("showOrder")
.antMatchers("/addOrder").hasAnyAuthority("addOrder")
.antMatchers("/login").permitAll()
.antMatchers("/updateOrder").hasAnyAuthority("updateOrder")
.antMatchers("/deleteOrder").hasAnyAuthority("deleteOrder")
.antMatchers("/**").fullyAuthenticated().and().formLogin().loginPage("/login").
successHandler(successHandler).failureHandler(failureHandler)
.and().csrf().disable();
}
@Bean
public static NoOpPasswordEncoder passwordEncoder() {
return (NoOpPasswordEncoder) NoOpPasswordEncoder.getInstance();
}
}
SpringSecurity的几个核心类:
- **Authentication:**是一个接口,用来表示用户认证信息的,在用户登录认证之前相关信息会封装为一个Authentication具体实现类的对象,在登录认证成功之后又会生成一个信息更全面,包含用户权限等信息的Authentication对象,然后把它保存在SecurityContextHolder所持有的SecurityContext中,供后续的程序进行调用,如访问权限的鉴定等。
- SecurityContextHolder:是用来保存SecurityContext的。SecurityContext中含有当前正在访问系统的用户的详细信息。
- ****AuthenticationManager和AuthenticationProvider:****AuthenticationManager是一个用来处理认证(Authentication)请求的接口,AuthenticationManager的默认实现是ProviderManager,而且它不直接自己处理认证请求,而是委托给其所配置的AuthenticationProvider列表,然后会依次使用每一个AuthenticationProvider进行认证,如果有一个AuthenticationProvider认证后的结果不为null,则表示该AuthenticationProvider已经认证成功,之后的AuthenticationProvider将不再继续认证。
- UserDetailService:登录认证的时候Spring Security会通过UserDetailsService的loadUserByUsername()方法获取对应的UserDetails进行认证,认证通过后会将该UserDetails赋给认证通过的Authentication的principal,然后再把该Authentication存入到SecurityContext中。之后如果需要使用用户信息的时候就是通过SecurityContextHolder获取存放在SecurityContext中的Authentication的principal。
- GrantedAuthority:每一个GrantedAuthority对象代表赋予给当前用户的一种权限。GrantedAuthority是一个接口,其通常是通过UserDetailsService进行加载,然后赋予给UserDetails的。
Basic认证:是一种简单的HTTP认证方式,它是一种基于用户名和密码的访问控制机制。在Basic认证中,客户端将用户名和密码以Base64编码的形式附加在HTTP请求头中,发送给服务器。虽然Base64编码可以防止明文传输,但它并不是一种加密方法,因此在安全性要求较高的情况下,应该使用HTTPS协议来加密通信。
Basic认证的HTTP请求头的格式如下:
Authorization: Basic base64EncodedCredentials
Bear认证:是另一种常见的HTTP认证方式,通常用于OAuth 2.0授权流程中。Bearer令牌(Token)是一种用于访问受保护资源的凭证,由授权服务器颁发。Bearer认证的原理是客户端在请求中携带有效的Bearer令牌,而服务端验证这个令牌的合法性来授权请求。
Bearer认证的HTTP请求头的格式如下:
Authorization: Bearer access_token
RBAC权限模型:基于角色的权限访问控制(Role-Based Access Control)作为传统访问控制(自主访问,强制访问)的有前景的代替受到广泛的关注。
OAuth2.0:OAuth(开放授权)是一个开放标准,允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方网站或分享他们数据的所有内容。
OAuth认证和授权的过程如下:
- 用户访问第三方网站网站,想对用户存放在服务商的某些资源进行操作。
- 第三方网站向服务商请求一个临时令牌。
- 服务商验证第三方网站的身份后,授予一个临时令牌。
- 第三方网站获得临时令牌后,将用户导向至服务商的授权页面请求用户授权,然后这个过程中将临时令牌和第三方网站的返回地址发送给服务商。
- 用户在服务商的授权页面上输入自己的用户名和密码,授权第三方网站访问所相应的资源。
- 授权成功后,服务商将用户导向第三方网站的返回地址。
- 第三方网站根据临时令牌从服务商那里获取访问令牌。
- 服务商根据令牌和用户的授权情况授予第三方网站访问令牌。
- 第三方网站使用获取到的访问令牌访问存放在服务商的对应的用户资源。
分布式链路追踪:为了实现请求跟踪,当请求发送到分布式系统的入口端点时, 只需要服务跟踪框架为该请求创建一个唯的跟踪标识, 同时在分布式系统内部流转的时候,框架始终保持传递该唯一标识, 直到返回给请求方为止,这个唯一标识就是前文中提到的Trace ID。通过Trace ID的记录,我们就能将所有请求过程的日志关联起来。Spring Cloud Sleuth和Zipkin 提供了分布式服务链路监控的解决方案。
SpringColud相关技术栈整理:
文章评论