当前位置:网站首页>微服务架构

微服务架构

2022-06-26 18:20:00 [email protected]

一,微服务架构

核心知识点

 微服务架构诞生的背景(软件即服务,将一个大型软件,拆成若干个小系统;分而治之~北京             一个火车站到多个火车站)
  微服务架构解决方案(大厂基本自研~自己研发各种组件,Spring Cloud ~Netflix,Alibaba,…)
  微服务架构下Maven聚合项目的创建方式?(Maven聚合项目~资源复用:extends,import,简化编             译,打包,部署方式)
  微服务架构入门聚合项目创建?(01-sca,sca-consumer,sca-provider,sca-gateway,sca-common)
 微服务中聚合工程之间的引用设计?(将一个工程作为依赖添加到其它工程~重点是坐标)


常见问题分析

为什么需要微服务?(对系统分而治,解决因并发访问过大带来的系统复杂性(例如:业务,开发,测试,升级,可靠性等)
微服务设计的特点?(单一职责,独立进程,开发测试效率高,可靠性高,升级难度小,但会带来一定的维护成本)
微服务解决方案有哪些?(大厂自研,中小企业采用开源Spring Cloud Alibaba,Spring Cloud Netfix等 )
微服务设计中需要哪些关键组件(服务的注册,发现,配置,限流降级,访问入口管理,分布式事务管理等)
创建聚合工程的目的?(实现工程之间资源的的共享,简化工程管理)
如何修改聚合工程中项目的编译和运行版本?(pom.xml:build->plugins->plugin->maven-compiler-plugin)
maven工程中build元素的作用?(定义项目的编译,打包方式)
maven父工程的packaging元素内的值是什么?(父工程默认打包方式为pom方式)
maven父工程中dependencyManagement元素的作用是什么?(项目依赖的版本,当前工程或子工程不需要再指定版本)
Maven父工程中如何统一定义JDK编译和运行版本?(配置maven编译插件:maven-compiler-plugin)

毕业版本

  <!--第一步: 定义子工程中核心依赖的版本管理(注意,只是版本管理)-->
    <dependencyManagement>
        <dependencies>
            <!--spring boot 核心依赖版本定义(spring官方定义)-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.3.2.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <!--Spring Cloud 微服务规范(由spring官方定义)-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR9</version>
                <type>pom</type><!--假如scope是import,type必须为pom-->
                <scope>import</scope><!--引入三方依赖的版本设计-->
            </dependency>

            <!--Spring Cloud alibaba 依赖版本管理 (参考官方说明)-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.2.6.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

二Nacos注册中心(为什么要用Nacos注册:为了负载均衡)

核心知识点


服务注册中心诞生背景? (服务多了,需要统一管理,例如所有公司需要在工商局进行备案)
服务注册中心的选型?(社区活跃度,稳定性,功能,性能,学习成本)
Nacos下载,安装,配置,启动,访问(http://ip:port/nacos)
基于Nacos实现服务的注册?(添加依赖,服务配置,启动服务并检查)
基于RestTemplate实现服务的简易调用?(服务消费方调用服务提供方)

为什么要将服务注册到nacos?(为了更好的查找这些服务)
在Nacos中服务提供者是如何向Nacos注册中心(Registry)续约的?(5秒心跳)
对于Nacos服务来讲它是如何判定服务实例的状态?(检测心跳包,15,30)
服务消费方是如何调用服务提供方的服务的?(RestTemplate)

基于http协议


常见问题分析


如何理解服务注册中心?(存储服务信息的一个服务)
服务注册中心诞生的背景? (服务多了,需要对服务进行更好管理)
市场上常用的注册中心?(Zookeeper,Eureka,Nacos,Consul)
如何对注册中心进行选型?(社区活跃度,稳定性,功能,性能,学习成本)
Nacos 是什么?(是Alibaba公司基于SpringBoo技术实现的一个注册中心,本质上也是一个web服务)
Nacos 的基本架构?(Client/Server架构)
Nacos 主要提供了什么核心功能?(服务的注册,发现,配置)
Nacos 服务启动需要什么前置条件?(配置JDK的JAVA_HOME目录,安装MySQL5.7以上版本,配置连接的数据库)
Nacos 服务单机模式,window平台下启动时的指令是什么?( 1,在Nacos的安装路径下找到:startup.cmd 可以在idea上配置进行启动NNacos,2,window平台下启动startup.cmd -m standalone)
实现Nacos服务注册需要添加什么依赖?(两个:web,discovery)
实现Nacos服务注册时,必须做哪些配置?(服务名,假如是本机服务注册可以省略服务地址)
Nacos如何检查服务状态?(通过心跳包实现,服务启动时会定时向nacos发送心跳包-BeatInfo)
服务之间进行服务调用时,使用了什么API?(RestTemplate,用此对象之前要先创建这个对象并交给spring管理)

三,基于Nacos实现服务发现与调用

核心知识点


负载均衡诞生背景.(网络中有一组可以提供相同服务的计算机~类似银行的各个营业点)
客户端负载均衡&服务端负载均衡的不同?(browser->nginx->…;sca-consumer->sca-provider)
基于LoadBalancerClient 对象从注册中心获取服务列表(服务发现)
基于Ribbon(一个负载均衡组件,这个组件中提供一套负载均衡算法)实现负载均衡
@Loadbalanced注解的应用(描述RestTemplate对象,为此对象的远程调用进行赋能)


常见问题分析


为什么负载均衡?(通过多个服务实例均衡处理客户端的请求,生活中有一种说法叫不患寡而患不均)
如何理解服务发现?(服务发现就是从注册中心获取服务信息,例如从nacos获取服务实例信息)
LoadBalancerClient的作用?(从nacos注册中心获取服务实例列表,然后本地基于负载均衡算法获取具体服务实例)
@Loadbalanced注解作用?(描述RestTemplate对象,让系统底层为RestTemplate对象赋能,对请求过程进行拦截)
你了解哪些负载均衡策略?(基于IRule接口去查看,快捷键ctrl+h)
我们如何修改负载均衡策略?(配置文件->例如application.yml,配置类->例如启功类)


四,基于Feign方式的服务调用

常见问题分析


为什么使用Feign方式的服务调用?(优化结构,简化服务调用过程代码的编写、)
如何基于feign方式实现远程服务调用?(依赖,配置,feign接口定义)
@EnableFeignCleints 注解的作用是什么?(描述配置类,例如启动类)
@FeignClient注解的作用是什么?(告诉Feign Starter,在项目启动时,为此注解描述的接口创建实现类-代理类)
如何理解基于Feign方式的远程服务调用?声明式远程服务调用,底层封装了服务调用过程。
Feign方式如何实现负载均衡?(底层基于ribbon组件实现)

常用服务发现、服务调用方式有哪些?

å¨è¿éæå¥å¾çæè¿°

五,Nacos配置中心

 常见问题分析


什么是配置中心?(存储项目配置信息的一个服务,这个服务可以实现配置的动态发布和更新)
为什么要使用配置中心?(集中管理配置信息,动态发布配置信息)
市场上有哪些主流的配置中心?(Apollo,nacos,……)
配置中心一般都会配置什么内容?(可能会经常变化的配置信息,例如连接池,日志、线程池、限流熔断规则)
什么信息一般不会写到配置中心?(服务端口,服务名,服务的注册地址,配置中心地址)
项目中为什么要定义bootstrap.yml文件?(此文件被读取的优先级比较高,可以在服务启动时读取配置中心的数据)
Nacos配置中心宕机了,我们的服务还可以读取到配置信息吗?(可以从服务的本地内存读取)
微服务应用中客户端如何感知配置中心数据变化?(1.4.x版本的nacos客户端会基于长轮询机制从nacos获取配置信息)
服务启动后没有从配置中心获取我们的配置数据是什么原因?(依赖,bootstrap.yml,配置单词,格式,配置模型)
你项目中使用的日志规范是什么?(SLF4J~门面模式)
你了解项目中的日志级别吗?(debug,info,warn,error可以基于日志级别控制日志的输出)
Nacos配置管理模型的背景?(环境不同配置不同)
Nacos配置中的管理模型是怎样的?(namespace>group>service/data-id)
Nacos客户端(微服务)是否可以读取共享配置?(可以)

六,Sentinel 限流应用

核心知识点

  • 服务限流、降级的背景
  • Sentinel限流入门实践(控制台8180-定义规则,客户端服务应用规则:依赖,配置)
  • Sentinel常用限流模式(直接,关联->保证核心业务,链路->红绿灯)
  • Sentinel降级(熔断)入门实现(出现不稳当的系统服务时,暂停对此服务的访问)
  • Sentinel实现热点参数限流(热点视频,文章,…),系统规则配置(例如cpu使用率),授权配置(黑白名单)

常见问题分析

  • 为什么要进行限流、降级? (系统处理能力有限,可以通过限流方式,保证系统可靠运行)
  • Sentinel限流的基本原理?(底层对服务请求进行拦截,然后通过流控规则限定对资源访问)
  • 你了解Sentinel限流有哪些算法? (计数器,令牌桶,漏桶,滑动窗口算法~sentinel默认)
  • Sentinel常用限流模式?(直接,关联->保证核心业务,链路->红绿灯)
  • @SentinelResource注解的作用,你用过哪些属性?(在链路限流中描述资源节点)
  • Sentinel常用限流效果有哪些?(快速失败,预热,排队
  • Sentinel中限流、降级操作被触发时出现的异常类型是什么?(都是BlockException类型的子类)
  • 如何对限流结果进行处理?(有默认处理方案,我们也可以自己定义处理规则-实现BlockExceptionHandler接口)

七,Gateway 应用实践

 核心知识点


  API 网关(Gateway)诞生背景
 市场主流微服务网关(Spring Cloud Gateway,zuul,…)
 API Gateway实现服务的保护和转发(重点)
 API Gateway层面的负载均衡实现(重点)
 API Gateway请求处理原理分析(重点)


 常见问题分析


 为什么要使用api网关?(服务保护,统一url访问,统一身份认证,统一跨域设计,。。。)
 网关入门实践的步骤? (依赖,配置,启动,服务访问)

Gateway 服务做请求转发时一定要在注册中心进行注册吗?(不一定,可以直接通过远端url进行服务访问)

网关进行请求转发的流程是怎样,有哪些关键对象?(XxxHandlerMapping,Handler,。。。)
 网关项目中的负载均衡是如何实现?(底层基于Ribbon实现,可以在RibbonLoadBalancerClient中   加断点分析)
 说说SpringCloud gateway处理请求的基本流程?(官方,断点)


八, Gateway 进阶应用实践

          核心知识点
                 网关中常用谓词(predicate)对象及实践。
                 网关中过滤器(Filter)的类型及实践。
                 网关中基于sentinel实现服务限流(API,路由id)。
                 网关中基于自定义限流结果的处理(GatewayCallbackManager)。
                 网关中实现统一跨域配置(推荐配置文件,参考官网)。
          常见问题分析
                 网关中的谓词对象类型?(GatewayPredicate)
                 网关中的谓词对象是如何创建的?(谓词工厂)
                 你在网关中配置过哪些常用谓词?(Path,Method,Before,Query,Header,…)
                 网关中的过滤器是如何分类的?(GlobalFilter,GatewayFilter:需要手动配置)
                 我们是否可以自定义谓词,过滤器对象?(可以,参考官方默认的定义)
                 网关层面如何基于sentinel实现限流?(有关sentinel的两个依赖,配置,JVM参数)
                 网关层面的限流类型有哪些?(路由id,API分组)
                我们是否可以对限流结果进行自定义处理?(可以,了解)
                 网关中做跨域如何设计?(Java代码方式配置,配置文件方式-推荐)
                 如何将路由,跨域,负载等配置写到配置中心?(注意层级关系)
          常见Bug分析
                  配置文件的格式?(一定要注意缩进关系)
                  配置中心数据读取不到?(依赖,bootstrap.yml,内容的格式,配置管理模型)
                  跨域配置问题?(服务于客户端的ajax请求)
å¨è¿éæå¥å¾çæè¿°

九,单点登录系统初步设计及实现

核心知识点
          单点登录系统诞生的背景。
          Java中单点登录系统解决方案。
           单点登录系统(SSO)中的服务划分及关系设计。
          单点登录系统中父工程的创建及初始化。
         系统基础服务(sso-system)工程的创建及基本业务实现。
常见问题分析
          为什么要做单点登录设计?(业务简化,代码复用,不需要每个服务都登录一次)

        你知道哪些SSO系统解决方案?(基于用户登录状态信息的存储进行方案设计)

        单点登录系统中你的服务是如何设计的,工程结构是怎样的?

         用户登录时,需要从数据库查询哪些信息?(用户信息以及用户的权限信息)

         如何基于用户id查询用户权限,你有什么方案?(3种)
 

        å¨è¿éæå¥å¾çæè¿°

å¨è¿éæå¥å¾çæè¿°

基于idea的为类自动生成序列化id?

å¨è¿éæå¥å¾çæè¿°

å¨è¿éæå¥å¾çæè¿°

如何将链接数据库的信息写到配置中心?

å¨è¿éæå¥å¾çæè¿°

@Autowired注解描述的Mapper对象有红色波浪线,但运行没有错误,如何去除红色波浪线。

å¨è¿éæå¥å¾çæè¿°

idea中如何在Database窗口打开要访问的数据库,例如

å¨è¿éæå¥å¾çæè¿°

十,SSO系统中的登录逻辑基本实现 

核心知识点

定义封装用户信息的User对象(一定主要包结构)
定义用户信息远程调用Feign接口(RemoteUserService~基于此接口调用sso-system服务中的用户信息)
基于Security规范定义用户业务逻辑服务对象(UserDetailsServiceImpl~调用RemoteUserService获取和封装用户信息)
定义用户认证基本配置类(SecurityConfig~配置密码加密对象,认证规则,以及登录成功或失败的处理方案)
实现自定义登录逻辑测试(校验登录正确账号和错误账户下服务端的响应结果)
熟悉SpringSecurity的认证流程?(Client->Filters->AuthenticationManager–>UserDetailService->…)


常见问题分析

为什么定义RemoteUserService 接口(Feign)?(基于此接口调用远程sso-system服务)
sso-auth服务中用户业务数据的获取在哪里?(客户端提交的用户名,sso-system服务提供的数据库数据)
为什么要构建SecurityConfig对象?(配置加密算法,认证规则)
为什么要让SecurityConfig类要继承WebSecurityConfigurerAdapter类型?(重写默认的认证规则)
认证过程中使用的密码加密对象是谁?(BCryptPasswordEncoder,不可逆加密对象)
单体架构中的用户的状态的存储是如何实现的?(了解,默认是存储到了tomcat的session对象中)
å¨è¿éæå¥å¾çæè¿°

十一, SSO系统颁发令牌及资源服务实践

核心知识点

认证服务器(sso-auth)中Token设计(UUID令牌,JWT令牌)
认证服务器(sso-auth)中Oauth2规范基本配置(认证入口,为谁认证,由谁认证,认证后颁发什么令牌)
基于Postman进行认证测试?(请求方式,请求url,认证参数)
资源服务器(sso-resource)核心业务分析及认证,授权规则设计及实现(匿名,认证,授权)


常见问题分析

JWT是什么?(是JSON WEB TOKEN这几个单词的缩写,描述的是web应用的一种令牌格式)
JWT有几部分构成?(头:令牌类型,签名算法,负载:允许包含用户登录状态 ,签名:防止令牌被篡改)
为什么要采用JWT令牌?(可以存储用户登录状态信息,避免访问资源时从数据库查询认证信息)
基于Oauth2协议的认证服务器默认的令牌生成策略是什么?(UUID.randomUUID())
认证服务器中常见令牌相关设计存储方案有哪些?(Mysql,Redis,Jwt)
认证服务器对用户进行认证时,客户端提交了哪些关键信息?(username,password,client_id,grant_type,client_secret)
认证服务器完成认证操作后,服务端返回哪些信息?(访问令牌,刷新令牌,令牌类型,作用域,编号)
认证服务器中完成认证业务的关键对象有哪些?(Filter,AutenticationManager,UserDetailService,.)
资源服务器如何设计的认证,授权规则?(三个维度:匿名,登录,授权)
访问令牌与刷新令牌有什么不一样?(客户端是要携带访问令牌访问资源的,刷新令牌是为了再次生成访问令牌)
访问令牌,刷新令牌有有效时长吗?(刷新令牌有效时长一般要大于访问令牌有效时长)


十二,SSO网关,UI工程以及操作日志实践

核心知识点

SSO系统中网关服务器(sso-gateway)实现路由转发,跨域设计,负载均衡,限流。
SSO系统中UI工程中页面设计(Bootstrap+VUE+axios)及请求响应代码分析(200,401,403)。
SSO系统中访问资源时进行用户行为日志的获取和记录。(AOP,Feign,Async)
 

常见问题分析

网关服务器在哪里做了负载均衡(lb://)?
为什么网关层面要做跨域设计?(Ajax技术不支持跨域请求,将所有服务的跨域共性提取到网关层面)
UI工程中用户端如何提交ajax请求的?(axios,底层ajax对象为XMLHttpRequest)
为什么在资源访问时要记录用户行为日志?(便于用户行为进行分析)
你基于什么技术获取的用户行为日志?(采用了AOP的设计)
你记录日志时采用的是同步还是异步方式?(异步方式)
项目切面中如何获取请求对象?(RequestContextHolder)
项目切面中获取获取登陆用户信息?(SecurityContextHolder)
你项目中哪里用到了反射技术呢?(Spring Bean对象的创建,依赖注入,方法对象的获取,方法上注解的获取,。。)
@PreAuthorize注解的作用是什么?(描述资源方法,告诉系统底层,访问此方法需要授权)

  • 400异常,请求参数不合法(参数个数,类型,格式)。

  • 401异常,认证失败?(提交的数据不正确)

  • 403异常,没有资源访问权限?(说明用户为已认证用户,但是没有资源的访问权限)

  • 415异常,数据协议有问题?(比方说,你要json数据,但是数据格式定义的是text)

小阶段总结

一种微服务架构设计思想(分而治之~服务治理)
一套微服务解决方案(Spring Cloud Alibba)
一种项目创建方式(Maven聚合项目)
五大微服务核心组件(Nacos,Feign,Ribbon,Sentinel,Gateway)
一套单点登录(SSO)系统,三个核心业务(微服务架构+5个核心组件+3个认证和授权技术)
常用的几种设计模式(策略模式,门面模式,代理模式,工厂模式,建造模式,责任链模式,桥接模式,装饰模式,适配器模式,单例设计,模板方法模式,。。。)

原网站

版权声明
本文为[[email protected]@yxg]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_49143405/article/details/121595121