企业为何要做网站,在国外建设网站,做网站怎样做全页面,主页面设计互联网时代#xff0c;面对复杂业务#xff0c;讲究 分而治之。将一个大的单体系统拆分为若干个微服务#xff0c;保证每个系统的职责单一#xff0c;可以垂直深度扩展。但是一个个独立的微服务像一座座孤岛#xff0c;如何将他们串联起来#xff0c;才能发挥最大价值。这… 互联网时代面对复杂业务讲究 分而治之。将一个大的单体系统拆分为若干个微服务保证每个系统的职责单一可以垂直深度扩展。但是一个个独立的微服务像一座座孤岛如何将他们串联起来才能发挥最大价值。这时我们就要提微服务的生态圈。那么微服务生态圈都有哪些模块他们的作用分别是什么服务的注册、发现。生产者启动时会将自己的信息注册上报这样调用方只需连接注册中心根据一定的负载算法就可以与服务提供方建立连接从而实现应用间的解耦。服务调用。通过多种协议如HTTP等实现目标服务的真正调用。负载均衡。主要是提供多种负载算法满足不同业务场景下的集群多实例的选择机制服务的稳定性。提供了服务熔断、限流、降级分布式配置中心。应用的配置项统一管理修改后能动态生效消息队列。非核心逻辑从同步流程抽离解耦异步化处理缩短RT时间网关。将一些通用的处理逻辑如限流、鉴权、黑白名单、灰度等抽取到一个单独的、前置化系统统一处理。监控。监控系统的健康状况分布式链路追踪。查看接口的调用链路为性能优化、排查问题提供输入自动化部署。持续集成快速部署应用。围绕这些功能模块Spring Cloud Alibaba 为我们提供了微服务化开发的一站式解决方案我们只需要少量的Spring 注解 和 yaml配置便可以快速构建出一套微服务系统。真的是创业者的福音。那么这套生态规范都提供了哪些技术框架呢一、Spring Boot服务基座Spring Boot 是Spring框架的扩展提供更加 丰富的注解根据 约定胜于配置 原则与市场主流的开源框架打通 设计了 Starter 和 AutoConfiguration 机制简化配置流程通过简单的jar包引入快速具备组件集成能力。大大提高了程序员的开发效率。特点提供了丰富的注解不要在XML文件中定义各种繁琐的bean配置内嵌 Web容器如Tomcat默认、Jetty、Undertow集成了主流开源框架根据项目依赖自动配置二、Nacos注册中心、分布式配置中心Nacos 是阿里巴巴的开源的项目全称 Naming Configuration Service 专注于服务发现和配置管理领域。Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。功能齐全可以替换之前的 Spring Cloud Netflix Eureka、Spring Cloud Config、Spring Cloud Bus野心巨大。客户端语言方面目前支持 Javago 、python、 C# 和 C等主流语言开源地址https://github.com/alibaba/nacosNacos 有一个控制台可以帮助用户管理服务监控服务状态、应用的配置管理。集群化部署由于 Nacos 是单节点无论做为注册中心还是分布式配置中心一旦服务器挂了作为底层服务引发的麻烦还是非常大的。如何保证其高可用Nacos 官方提供的集群部署架构图https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html在nacos的解压目录nacos/conf目录下有配置文件cluster.conf每行配置成 ip:port。一般配置3个或3个以上节点# ip:port
200.8.9.16:8848
200.8.9.17:8848
200.8.9.18:8848这样保证客户端只需要写一次由 Leader节点将数据同步到其他节点保证各个节点的数据一致性对于上层的SLB我们可以采用 Nginx 或者 OpenResty在 upstream 模块里配置 Nacos 的集群IP 地址列表实现负载均衡功能。另外借助Nginx的心跳检测当某台 Nacos 服务挂掉后SLB 会自动屏蔽将流量切换到其他 Nacos 实例。当然 OpenResty 也可能成为单点故障为了保证高可用我们需要借助 Keepalived客户端请求 VIP然后请求打到了 OpenResty由 OpenResty 转发给具体的某个 Nacos 节点。OpenResty 只有一个节点提供服务另一个暂停状态如果 master 节点宕机那 backup 接替继续工作。从而解决了单点故障问题。Keepalived 作为一种高性能的服务器高可用或热备解决方案用来防止服务器单点故障的发生。市面资料很多下文链接是《KeepalivedNginx部署方案》具体操作步骤https://help.fanruan.com/finereport/doc-view-2905.html三、RestTemplate Ribbon 远程调用Spring Cloud Ribbon 基于 Netflix Ribbon 封装的负载均衡框架。内部集成了多种负载算法如随机、轮询等。与注册中心打通能自动获取服务提供者的地址列表。结合自身的负载算法选择一个目标实例发起服务调用。Ribbon 也提供了扩展接口支持自定义负载均衡算法。public class CustomRule extends AbstractLoadBalancerRule {private AtomicInteger count new AtomicInteger(0);Overridepublic Server choose(Object key) { return choose(getLoadBalancer(), key);}private Server choose(ILoadBalancer loadBalancer, Object key) {ListServer allServers loadBalancer.getAllServers(); int requestNumber count.incrementAndGet(); if (requestNumber Integer.MAX_VALUE) { count new AtomicInteger(0); }if (null ! allServers) {int size allServers.size();if (size 0) {int index requestNumber % size; Server server allServers.get(index);if (null server || !server.isAlive()) { return null;}return server;}}return null;}
}缺点调用方每次发起远程服务调用时都需要填写远程目标地址还要配置各种参数非常麻烦不是很方便// 注册到Nacos的应用名称
private final String SERVER_URL http://nacos-provider-demo;
Resource
private RestTemplate restTemplate;RequestMapping(/hello)
public String hello() {// 远程服务调用return restTemplate.getForObject(SERVER_URL /hello, String.class);
}四、OpenFeign远程调用RestTemplate Ribbon 每次发起远程服务调用时都需要填写远程目标地址还要配置各种参数非常麻烦。Feign 是一个轻量级的 Restful HTTP 客户端内嵌了 Ribbon 作为客户端的负载均衡。面向接口编程使用时只需要定义一个接口并加上FeignClient注解非常方便。OpenFeign 是 Feign 的增强版。对 Feign 进一步封装支持 Spring MVC 的标准注解和HttpMessageConverts依赖包dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-openfeign/artifactId
/dependencyFeignClient(value ${provider.name})
public interface OrderService {// 调用服务提供者的 /create_order 接口RequestMapping(value /create_order,method RequestMethod.GET) public String createOrder();其中FeignClient(value ${provider.name}) 定义了服务提供方的工程名底层自动打通了注册中心会拿到 artifactId 对应的IP列表根据一定的负载均衡算法可以将请求打到目标服务器上。OpenFeign 默认等待接口返回数据的时间是 1 秒超过这个时间就会报错。如果想调整这个时间可以修改配置项 feign.client.config.default.readTimeout五、Dubbo Spring Cloud远程调用RestTemplate Ribbon 和 OpenFeign 都是基于HTTP协议调用远程接口。而 Dubbo Spring Cloud 是基于 TCP 协议来调用远程接口。相比 HTTP 的大量的请求头TCP 更轻量级。Dubbo Spring Cloud Spring Cloud Dubbo特性支持多种注册中心用于服务的注册、发现内置多种负载均衡策略服务粒度是面向接口支持 TCP 轻量级协议容易扩展采用 微内核 插件 的设计原则扩展点更强依赖包dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-dubbo/artifactId
/dependency注意虽然是将 Dubbo 集成到了 Spring Cloud增加了一些 注解 和 yaml 配置项开发更方便但大部分调用玩法还是遵守 Dubbo 框架那一套。几个重要的配置项dubbo.scan.base-packages # dubbo 服务扫描基准包上报注册服务dubbo.protocol.name: dubbo # 支持的协议dubbo.protocol.port: -1 # dubbo 协议端口 -1 表示自增端口从 20880 开始dubbo.registry.address # 注册中心地址六、Spring Cloud Gateway网关分布式时代一个复杂的系统被拆分为若干个微服务系统每个系统都配置独立的域名肯定不合适。为了解决这个问题网关便诞生了。网关充当反向代理的角色作为流量的第一入口承载了很多基础的、公共的模块功能如流控、鉴权、监控、路由转发等。Spring Cloud 生态早期的网关是 Netflix 公司的Zuul后来Zuul社区停止了维护。官方后来推出了 Spring Cloud Gateway其底层是基于 WebFlux 框架而WebFlux框架的底层采用高性能通讯框架 Netty性能是 Zuul 的 1.6 倍。核心组件1、路由。内部主要是负责转发规则。2、断言Predicate如果返回为true当前路由才有效才会路由到具体的服务。官方提供了很多内置路由断言如果满足不了你的诉求也可以自定义路由断言工厂。所有的路由断言工厂都是继承自 AbstractRoutePredicateFactory自定义类的命名也有固定规则“配置名”RoutePredicateFactory。这样在yaml配置时只需要写前面定义的配置名即可。3、过滤器Filter主要是请求、响应之间增加一些自定义的逻辑。按作用范围分为全局和局部。全局是作用于所有的路由而局部只是作用于某一个路由。跟上面的断言类似除了官方提供的过滤器也支持自定义。局部过滤器继承自 AbstractGatewayFilterFactory自定义类的命名也有固定规则“配置名”GatewayFilterFactory。这样在yaml配置时只需要写前面定义的配置名即可。全局过滤器实现GlobalFilter,Ordered 两个接口实现逻辑跟上面的局部过滤器类似。这里就不展开了。其中的 Ordered 接口主要是负责优先级数值越小优先级越高。依赖包dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-gateway/artifactId
/dependencyyaml 的配置示例spring:cloud:gateway:routes: #路由可配置多个- id: user_route # 路由id 唯一即可默认是UUIDuri: lb://user-server-sample # 匹配成功后提供的服务的地址order: 1 # 路由优先级数值越小优先级越高默认0predicates:- Path/user/** # 断言路径匹配进行路由# - User0, 1000 # 自定义路由断言工厂 只允许查询id为0 - 1000之间的用户# - MethodPOST # 表示需要POST方式请求# - Queryid, \d # 参数名id正则表达式为\d一个或多个数字filters:- AddRequestHeaderX-Request-token, 12345678 #为原始请求加上请求头及值当然服务提供方的地址可能经常变化为了动态感知我们引入 Nacos 注册中心用于服务的注册、发现统一管理服务的IP地址。网关路由转发时只需从 Nacos 动态获取即可。七、Sentinel熔断、限流、降级Sentinel 是阿里开源的流控框架提供了简单易用的控制台比 Hystrix支持的范围更广。集成简单只需要少量配置即可快速接入支持如gRPC、Dubbo、Spring Cloud 等同类竞品框架Hystrix 框架已经停止维护Resilience4j 一种轻量级容错库专为 Java 8 和函数式编程而设计。通过装饰器的方式以使用断路器速率限制器重试或隔板来增强任何功能接口lambda 表达式或方法引用。流控规则页面元素介绍资源名唯一即可针对来源对调用者限流填写应用名称Spring.application.name的值只针对某个服务限流阈值类型QPS每秒接收的请求数线程数能使用的业务线程数流控模式直接达到条件后直接执行某个流控效果关联如果访问关联接口B达到了阈值则让接口A返回失败链路记录从入口资源的流量达到条件也只限流入口资源流控效果快速失败直接返回失败结果Warm Up预热开始有一个缓冲期初始值 阈值/ codeFactor(默认 3)然后慢慢达到设置的阈值排队等待让请求以均匀的速度通过如果请求超过阈值就等待如果等待超时则返回失败降级规则RT异常数异常比例系统规则流控规则和降级规则是针对某个资源来说的而系统规则是针对整个应用的粒度更大当前所有的接口服务都会应用这个系统规则。授权规则根据调用方判断调用的接口资源是否被允许如黑名单、白名单机制热点规则将粒度进一步细化可以针对方法的参数做规则控制为每个参数设置单独的阈值也可以多个参数组合。从而实现单个方法的热点流量按业务需求进一步控制。SentinelResource注解SentinelResource 注解可以根据实际情况定制化功能跟 Hystrix 的 HystrixCommand 注解功能类似。达到阈值后系统的默认提示是一段英文很不友好所以我们要自定义兜底方法。// 资源名称为handle1
RequestMapping(/handle1)
SentinelResource(value handle1, blockHandler blockHandlerTestHandler)
public String handle1(String params) { // 业务逻辑处理return success;
}// 接口方法 handle1 的 兜底方法
public String blockHandlerTestHandler(String params, BlockException blockException) {return 兜底返回;
}注意SentinelResource注解中除了blockHandler字段外还有fallback字段blockHandler主观层面如果被限流则调用该方法进行兜底处理fallback对业务的异常兜底比如执行过程中抛了各种Exception则调用该方法进行兜底处理通过上面两层兜底可以让Sentinel 框架更加人性化体验更好。集群流控单机限流很容易做但是互联网很多应用都是集群部署毕竟其下游还挂载着 mysql、或者其他微服务为了防止对下游的大流量冲击采用集群流控。防止单机的流量不均匀 理想下 QPS 单机阈值 * 节点数八、Seata分布式事务事务的原子性和持久性可以确保在一个事务内更新多条数据要么都成功要么都失败。在一个系统内部我们可以使用数据库事务来保证数据一致性。那如果一笔交易涉及到跨多个系统、多个数据库的时候用单一的数据库事务就没办法解决了此时需要引入分布式事务Seata 是一款开源的分布式事务解决方案致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式默认 AT 模式 为用户打造一站式的分布式解决方案。优点对业务无侵入即减少技术架构上的微服务化所带来的分布式事务问题对业务的侵入高性能减少分布式事务解决方案所带来的性能消耗Seata有3个基本组成部分事务管理器TM定义全局事务的范围开始全局事务提交或回滚全局事务。事务协调器TC维护全局事务和分支事务的状态驱动全局提交或回滚。资源管理器RM管理正在处理的分支事务的资源与TC对话以注册分支事务并报告分支事务的状态并驱动分支事务的提交或回滚。运行流程TM 向 TC 申请开启一个全局事务全局事务创建成功并生成一个全局唯一的 XIDXID 在微服务调用链路的上下文中传播RM 向 TC 注册分支事务TC 返回分支事务ID 并将其纳入 XID 对应全局事务的管辖RM 执行本地业务表操作并记录 undo_log 日志提交本地事务当所有的 RM 都执行完后TM 向 TC 发起针对 XID 的全局提交或回滚决议TC 调度 XID 下管辖的全部分支事务完成提交或回滚请求。如果提交删除 undo_log 日志就可以了。如果是回滚根据 undo_log 表记录逆向回滚本地事务把数据还原最后再删除 undo_log 日志。关于 Seata 之前写过很多文章这里就不展开了感兴趣可以看看业务无侵入框架Seata 解决分布式事务问题深度剖析 Seata TCC 模式【图解 源码分析】七种分布式事务的解决方案一次讲给你听九、Spring Cloud Stream 异步消息Spring Cloud Stream 是统一消息中间件编程模型的框架屏蔽了底层消息中间件的差异。支持的MQ 框架有 RabbitMQ、Kafka、RocketMQ 等常用注解Input标记为输入信道消费消息Output标记为输出信道生产消息StreamListener监听某个队列接收消息处理自身的业务逻辑EnableBinding绑定通道依赖包dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-stream-rocketmq/artifactId
/dependency绑定通道SpringBootApplication
EnableBinding({CustomSource.class})
public class StreamProduceApplication {public static void main(String[] args) {SpringApplication.run(StreamProduceApplication.class, args);}
}定义输出信道public interface CustomSource {Output(output1)MessageChannel output1();
}yaml 配置spring:cloud:stream:rocketmq:binder:name-server: 127.0.0.1:9876 # rocketMq服务地址bindings:output1:producer:transactional: true # 事务group: myTxProducerGroup # 事务分组bindings:output1:destination: test-transaction-topic # 主题content-type: application/json # 数据类型发送消息Service
public class SendMessageService {Resourceprivate CustomSource customSource;public String sendMessage() { //发送简单字符串消息的方法String message 字符串测试消息;// 发送消息customSource.output1().send(MessageBuilder.withPayload(message).build()); return 发送成功;}
}十、SkyWalking分布式链路追踪SkyWalking 是 一款 APM应用性能监控系统专为微服务、云原生架构、容器Docker、k8s、Mesos而设计。通过探针收集应用的指标进行分布式链路追踪感知服务间的调用链路关系。特性支持告警采用探针技术代码零侵入轻量高效不需要大数据平台多个语言自动探针。包括 Java.NET Core 和 Node.JS。强大的可视化后台上部分 Agent 负责从应用中收集链路信息发送给 SkyWalking OAP 服务器。目前支持 SkyWalking、Zikpin、Jaeger 等提供的 Tracing 数据信息。而我们目前采用的是SkyWalking Agent 收集 SkyWalking Tracing 数据传递给服务器。下部分 SkyWalking OAP 负责接收 Agent 发送的 Tracing 数据信息然后进行分析(Analysis Core) 存储到外部存储器( Storage )最终提供查询( Query )功能。右部分 Storage Tracing 数据存储。目前支持 ES、MySQL、Sharding Sphere、TiDB、H2 多种存储器。而我们目前采用的是 ES 主要考虑是 SkyWalking 开发团队自己的生产环境采用 ES 为主。左部分 SkyWalking UI 负责提供控台查看链路等等。SkyWalking 部署起来还是很简单的apache官网直接下载并解压即可。https://skywalking.apache.org/SkyWalking 快速入门手册https://skywalking.apache.org/zh/2020-04-19-skywalking-quick-start/十一、XXL-JOB分布式任务调度关于定时任务相信大家都不陌生。但是单节点的定时任务有很多不足不支持集群如果同时部署多个节点会竞争数据造成数据重复如果是单节点宕机后任务无法自动感知、重启不支持任务失败重试不支持执行时间的动态调整无报警机制无任务数据统计功能不支持数据分片无论是集群化还是周边的生态建设都不完备。而 XXL-JOB可以完美解决这些问题。XXL-JOB 是一款分布式任务调度框架依赖的组件少仅依赖 Java 和 MySQL开箱即用。并提供了可视化界面统计任务数据动态修改任务执行时间内置邮件报警支持任务分片和任务失败重试。核心模块1、调度中心本身不执行业务逻辑只负责向执行器发送调度命令。2、执行器接收调度中心的请求并执行业务逻辑。依赖包dependencygroupIdcom.xuxueli/groupIdartifactIdxxl-job-core/artifactIdversion2.2.0/version
/dependencyyaml 配置server:port: 8082 #程序端口
xxl:job:admin:addresses: http://127.0.0.1:8002/xxl-job-admin # 调度中心地址多个用逗号分开accessToken: # 调度中心和执行器通信的token如果设置两边要一样executor:appname: xxl-job-executor-sample #执行器名称address: # 执行器地址默认使用xxl.job.executor.address配置项如果为空则使用xxl.job.executor.ip xxl.job.executor.portip: # 执行器IPport: 9989 #执行器端口与调度中心通信的端口logpath: D:/work/Spring-Cloud-Alibaba/sample/logs # 日志保存路径logretentiondays: 30 # 日志保留天数XxlJobSpringExecutor 初始化Bean
public XxlJobSpringExecutor xxlJobExecutor() { // XXL-JOB执行器初始化XxlJobSpringExecutor xxlJobSpringExecutor new XxlJobSpringExecutor();xxlJobSpringExecutor.setAdminAddresses(adminAddresses);xxlJobSpringExecutor.setAppname(appname);xxlJobSpringExecutor.setAddress(address);xxlJobSpringExecutor.setIp(ip);xxlJobSpringExecutor.setPort(port);xxlJobSpringExecutor.setAccessToken(accessToken);xxlJobSpringExecutor.setLogPath(logPath);xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);return xxlJobSpringExecutor;
}我们可以采用 BEAN 模式 使用 XxlJob 注解描述代码。优点适用于一些复杂的业务场景。也可以采用 GLUE 模式将 执行代码 托管到调度中心在线维护。优点简单快捷不需要单独的业务工程。如果要处理的数据量较大时我们可以采用分片处理机制将任务均摊到每个节点从而减轻单个节点的压力。shardingVO.getIndex() # 当前执行器的分片序号从0开始
shardingVO.getTotal() # 总分片数执行器集群的数量# dataSource 待处理的所有原始数据
for (Integer val : dataSource) { // 遍历代理if (val % shardingVO.getTotal() shardingVO.getIndex()) { // 取余//TODO 归属于当前分片处理}
}XXL-JOB 快速入门手册https://www.xuxueli.com/xxl-job/巨人肩膀《Spring Cloud Alibaba 微服务实战》