微服务架构与SpringCloud搭建的一个Demo

本文介绍了系统架构从单体到微服务的演变过程,涉及集群、SOA、微服务等概念。重点讲解了微服务架构的优势,如独立开发和部署、故障隔离。讨论了服务注册、服务发现和负载均衡,并提到了Nacos在服务治理中的作用。此外,文章还探讨了服务调用、服务容错(如Sentinel)、高并发下的解决方案以及API网关的角色。最后,提到了消息队列MQ在异步解耦中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

架构: 系统架构的一个演变的过程 单体架构 -> 集群架构->垂直架构->SOA架构->到现在的微服务架构 

单体架构就是在一台机器上 同一进程

集群就是 抽象点就是开三个后端服务  同一个业务 部署在多个服务器上 这也会产生就是说 比如我同时开三个后端 有时候我的一个服务需要扩展 另外两个服务也需要同时扩展 导致系统的扩展性不好 横向扩展还好

再进行拆分的话就是微服务  分为商品服务 订单服务 用户服务 使得系统的耦合性降低 这样也会产生问题 各个服务之间的调用问题  

微服务架构的优势: 独立开发 独立部署  故障隔离 混合技术堆栈 粒度缩放 

服务注册 : 将服务实例将自身服务信息注册到注册中心

服务发现:  服务实例通过注册中心 获取到注册到其中的服务实例信息  通过这些信息去请求这些提供的服务  

服务剔除: 注册中心把出问题的服务剔除掉  使得其不再被调用 

服务调用 :多个服务之间的;远程调用

服务网关: 服务网关的出现主要是针对于 这些问题出来的  ; 客户端需要调用不同的url增加难度 在一些场景下 存在着跨域请求的问题  每个微服务都需要有单独的身份验证  API网关是将所有的调用都接入API网关层中 和输出 网关会根据你的请求地址去找到其对应的服务

服务容错 : 其中一个服务出现了问题 可能会导致一系列的问题 导致下游不可用 要尽量做好容错 

链路追踪 :就是 链路请求在系统内部的轨迹  

搭建项目 以用户  商品 订单为例 搭建一个springcloud的一个项目

主要模块有 公共模块 common放一些工具类之类的  user微服务 order微服务  product微服务

服务调用 :

通过RestTemplate来实现服务的调用 

例如:

User user = restTemplate.getForObject("http://127.0.0.1:8081/user/findUser/"+uid, User.class);

  这种调用方法虽然可以实现服务的调用 但是会产生新的问题 一旦我的服务地址发生变化 的话就需要手动的去修改代码 多个服务的提供者 无法实现负载均衡 服务越来越多人工维护关系困难

服务治理 : Nacos

服务治理是我们最核心的一个模块 用服务治理来实现我们各个微服务模块之间的自动化 的注册和发现 

 服务注册 ;

服务治理框架中会构建一个注册中心每个服务都会去注册中心登记自己提供的服务  在注册中心中就会有自己的一个服务的清单 可以 在服务中心去剔除不可用的服务 服务中心会去检测这些服务是否可用 

服务发现 : 

服务调用向注册中心去获取所有服务的清单 实现具体服务的实例访问

注册中心一般包含以下的内容: 服务发现 服务配置 服务健康检测 

服务发现  保存服务提供者和服务调用者的信息

常见的注册中心  zookeeper  Eureka  Nacos 

我搭建的使用的是nacos 下载  配置   就可以使用

nacos实现服务的调用使用 discoverClient  通过nacos获取 url和对应的服务

服务调用实现负载均衡 : 通过自定义实现负载;均衡 就是使用随机数策略  负载均衡就是将负载进行分摊到多个操作单元上执行  

基于Ribbon实现负载均衡的策略 调用 策略就是通过服务名去找到对应的对应的服务 总共有七种负载均衡的策略 :

轮询策略  随机数策略 权重策略 最小连接数策略 区域敏感策略 可用敏感性策略 重试策略        

基于feign实现负载均衡策略: 通过接口来实现服务的调用  feign中自动集成了Ribbon 所以可以实现负载均衡策略 通过在 接口上加注解@FeignClient("服务名") 然后通过接口来调用服务 这种写法比较简单而且优雅  

随后就是考虑高并发的问题 : 服务容错   高并发带来的问题  大量的请求过来可能导致服务瘫痪   模拟高并发的场景 用的是jmter  对代码进行压力测试  最终 大量的请求过来会导致无法访问的情况形成 了服务雪崩   各个服务之间有直接依赖性   下游的服务出错可能导致我们之前的服务也没办法进行正常的服务提供  可能会导致服务雪崩 只有做好容错才能保证我们即使一个服务出错之后其它的服务也可以正常的进行运作 : 也就是 "雪落而不崩" 的情况 常见的思路有隔离  超时  限流 熔断 降级

隔离就是 各个模块直接没有强依赖 线程池隔离 信号量隔离

限流 : 1秒钟之内只能有一个请求过来 

熔断; 暂时切断对下游服务的调用 

降级就是使用备用方案

我用Sentinel 主要有熔断控制  流量降级  

GateWay 网关 有那么多服务不知道该调那个 就使用网关来调用  而且调用服务的时候要对用户进行鉴权  也可以用网关来实现  只对外提供一个网关接口供用户去调用 具体调用交给网关 

通过访问网关  然后网关将请求转发给商品服务然后结合nacos可以从注册中心去获取我们的服务加过滤器之类的  也可以使用Sentinel对网关限流 实际上是通过filter来实现的

MQ message queue 消息队列

应用场景

异步解耦 :  耦合就是 比如送快递  快递员把快递送到用户的手里 等待用户来拿快递员才走 这就是耦合 同步的  异步就是快递员把快递送到快递驿站去 用户去快递站拿  就是异步解耦  彼此不联系 也不受影响 

demo参考网上资料,使用mvn建项,使用者需要有一定mvn基础。 demo没有实现复杂业务,只实现了部分功能: 微服务模块初始化时,常量和数据库信息等使用云配置服务(spring config)获取; 微服务之间使用负载均衡(ribbon); 微服务网关路由配置; 微服务断路器(hystrix)及监听服务等 启动步骤: 1.启动server-eureka,端口6600,微服务注册中心 访问http://localhost:6600,查看效果 2.启动server-config,端口6700,统一配置服务中心 访问http://localhost:6700/service-order/online,查看效果 3.启动service-order,端口6002,初始化使用配置服务server-config动态加载数据库 访问http://localhost:6002/order,查看效果 4.启动service-user,端口6001,使用注册后的服务名service-order进行服务之间调用,避免传统维护困难的ip:port方式 模块中使用了ribbon负载均衡请求service-order,需要启动至少两个service-order服务 访问http://localhost:6001/user/order,查看效果 5.启动gateway-zuul,端口6000,用于url路由配置,服务统一端口入口 http://localhost:6000/service-order/order等效于访问http://localhost:6002/order http://localhost:6000/service-user/user/order等效于访问http://localhost:6001/user/order 6.启动hystrix-dashboard,端口6500,可选,WEB界面查看监听服务,如服务成功多少,失败多少等信息 进入hystrix-dashboard界面后,填入监控地址:http://localhost:6001/hystrix.stream
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值