当前位置: 首页 > news >正文

怀化建设局网站商丘企业网站建设费用多少钱

怀化建设局网站,商丘企业网站建设费用多少钱,华夏集团网站建设,中国排名第一的策划公司导语 本文介绍了微服务优雅上下线的实践方法及原理#xff0c;包括适用于 Spring 应用的优雅上下线逻辑和服务预热#xff0c;以及使用 Docker 实现无损下线的 Demo。同时#xff0c;本文还总结了优雅上下线的价值和挑战。 作者简介 颜松柏 腾讯云微服务架构师 拥有超过…导语 本文介绍了微服务优雅上下线的实践方法及原理包括适用于 Spring 应用的优雅上下线逻辑和服务预热以及使用 Docker 实现无损下线的 Demo。同时本文还总结了优雅上下线的价值和挑战。 作者简介 颜松柏 腾讯云微服务架构师 拥有超过10年的 IT 从业经验精通软件架构设计微服务架构云架构设计等多个领域在泛互、金融、教育、出行等多个行业拥有丰富的微服务架构经验。 前言 微服务优雅上下线的原理是指在微服务的发布过程中保证服务的稳定性和可用性避免因为服务的变更而造成流量的中断或错误。 微服务优雅上下线的原理可以从三个角度来考虑 服务端的优雅上线即在服务启动后等待服务完全就绪后再对外提供服务或者有一个服务预热的过程。 服务端的无损下线即在服务停止前先从注册中心注销拒绝新的请求等待旧的请求处理完毕后再下线服务。 客户端的容灾策略即在调用服务时通过负载均衡、重试、黑名单等机制选择健康的服务实例避免调用不可用的服务实例。 微服务优雅上下线可以提高微服务的稳定性和可靠性减少发布过程中的风险和损失。 优雅上线 [外链图片转存中…(img-rvW8Rj8q-1689158362085)] 优雅上线也叫无损上线或者延迟发布或者延迟暴露或者服务预热。 优雅上线的目的是为了提高发布的稳定性和可靠性避免因为应用的变更而造成流量的中断或错误。 优雅上线的方法 优雅上线的方法有以下几种 延迟发布即延迟暴露应用服务比如应用需要一些初始化操作后才能对外提供服务如初始化缓存数据库连接池等相关资源就位可以通过配置或代码来实现延迟暴露。 QoS 命令即通过命令行或 HTTP 请求来控制应用服务的上线和下线比如在应用启动时不向注册中心注册服务而是在服务健康检查完之后再手动注册服务。 服务注册与发现即通过注册中心来管理应用服务的状态和路由信息比如在应用启动时向注册中心注册服务并监听服务状态变化事件在应用停止时向注册中心注销服务并通知其他服务更新路由信息。 灰度发布即通过分流策略来控制应用服务的流量分配比如在发布新版本的应用时先将部分流量导入到新版本的应用上观察其运行情况如果没有问题再逐步增加流量比例直到全部切换到新版本的应用上。 上面的方法核心思想都是一个就是等服务做好了准备再把请求放行过去。 优雅上线的实现 大部分优雅上线都是通过注册中心和服务治理能力来实现的。 对于初始化过流程较长的应用由于注册通常与应用初始化过程同步进行因此可能出现应用还未完全初始化就已经被注册到注册中心供外部消费者调用此时直接调用可能会导致请求报错。 所以通过服务注册与发现来做优雅上线的基本思路是 在应用启动时提供一个健康检查接口用于反馈服务的状态和可用性。 应用启动后可以采用下列方法来使新的请求暂时不进入新版的服务实例。 暂时不向注册中心注册服务。隔离服务有些注册中心支持隔离服务实例比如北极星。将权重配置为0。将服务实例的 Enable 改为 False。让健康检查接口返回不健康的状态。 在新版本的应用实例完成初始化操作后确保了可用性后再对应的将上述的方法取消这样就可以让新的请求被路由到新版本的应用实例上。 如果需要预热就让流量进入新版本的应用实例时按比例的一点点增加。 这样就可以实现优雅上线的过程保证请求进来的时候不会因为新版本的应用实例没有准备好而导致请求失败。 优雅上线的北极星代码 Demo 我们以 Spring Cloud 和 北极星 为例讲一下如何通过服务注册与发现来做优雅上线的过程。 首先我们需要创建一个 Spring Cloud 项目并添加北极星的依赖。 然后我们需要在 application.properties 文件中配置北极星的相关信息如注册中心地址服务名分组名等例如 spring:application:name: ${application.name}cloud:polaris:address: grpc://${修改为第一步部署的 Polaris 服务地址}:8091namespace: default然后我们需要创建一个 Controller 类提供一个简单的接口用于返回服务的信息例如 RestControllerpublic class ProviderController {Value(${server.port})private int port;GetMapping(/hello)public String hello() {return Hello, I am provider, port: port;}}最后如果需要我们可以重写健康检查接口用于反馈服务的状态和可用性。这里我们需要引入 Actuator。 Componentpublic class DatabaseHealthIndicator implements HealthIndicator {Overridepublic Health health() {if (isDatabaseConnectionOK()) {return Health.up().build();} else {return Health.down().withDetail(Error Code, DB-001).build();}}private boolean isDatabaseConnectionOK() {// 检查数据库连接、缓存等return true;}}这样我们就完成了一个简单的服务提供者应用并且可以通过北极星来实现服务注册与发现。 接下来我们需要创建一个服务消费者应用并且也添加北极星的依赖和配置信息。 然后使用 RestTemplate 来调用服务提供者的接口例如 SpringBootApplicationpublic class ConsumerApplication {public static void main(String[] args) {SpringApplication.run(ConsumerApplication.class, args);}BeanLoadBalanced // 开启负载均衡public RestTemplate restTemplate() {return new RestTemplate();}RestControllerpublic class ConsumerController {Autowiredprivate RestTemplate restTemplate;GetMapping(/hello)public String hello() {// 使用服务名来调用服务提供者的接口return restTemplate.getForObject(http://provider/hello, String.class);}}}这里我们使用了 LoadBalanced 注解来开启负载均衡功能并且使用服务名 provider 来调用服务提供者的接口。 这样我们就完成了一个简单的服务消费者应用并且可以通过北极星来实现服务注册与发现。 接下来我们就可以通过以下步骤来实现优雅上线的过程 在发布新版本的服务提供者应用时先启动新版本的应用实例但是不向注册中心注册服务或者让健康检查接口返回不健康的状态这样就不会有新的请求进入新版本的应用实例。这可以通过配置或代码来实现例如 # 不向注册中心注册服务spring.cloud.polaris.discovery.registerfalse// 让健康检查接口返回不健康的状态this.isHealthy false;在新版本的应用实例完成初始化操作后再向注册中心注册服务或者让健康检查接口返回健康的状态这样就可以让新的请求被路由到新版本的应用实例上。这可以通过配置或代码来实现例如 # 向注册中心注册服务spring.cloud.polaris.discovery.registertrue// 让健康检查接口返回健康的状态this.isHealthy true;这样就可以实现优雅上线的过程保证正在处理的请求不会被中断而新的请求会被路由到新版本的应用上。 不过如果对优雅上线的极致要求不高北极星本身就是支持优雅上线的无须做额外的操作。因为北极星的逻辑是当 Spring 的 Bean 全部加载完成后Controller 能访问后才会去注册服务。所以在绝大多数的场景下它已经满足了优雅上线的要求。 服务预热 服务预热是指在服务上线之前先让服务处于一个运行状态让其加载必要的资源、建立连接等以便在服务上线后能够快速响应请求。如下图所示。 在流量较大情况下刚启动的服务直接处理大量请求可能由于应用内部资源初始化不彻底从而出现请求阻塞、报错等问题。此时通过服务预热在服务刚启动阶段通过小流量帮助服务在处理大量请求前完成初始化可以帮助发现服务上线后可能存在的问题例如资源不足、连接数过多等从而及时进行调整和优化确保服务的稳定性和可靠性。 云原生 API 网关实现服务预热 云原生 API 网关是腾讯云基于开源微服务网关推出的一款高性能高可用的云上网关托管产品。我们可以通过简单的几个配置就能实现服务预热。 首先我们在网关新建后端服务的时候可以打开下图中的慢启动开关。同时可以设置慢启动的时间。 开启后服务端有新的服务节点上线后会在设置的慢启动的时间内将新节点的权重从1逐步增加到目标值。这个新节点的流量会慢慢增加。 如果有多个新增节点那所有新增的节点都会慢启动。 针对后端来源是 K8S 服务 、注册中心、IP 列表的服务都可以实现慢启动也就是服务预热。 优雅下线 无损下线、优雅下线都是同一个意思。都是为了避免服务下线的时候由于请求没有处理完导致请求失败的情况。 优雅下线的方法 无损下线的一些常用的工具或框架有 Dubbo-go支持多种注册中心、负载均衡、容灾策略等可以实现优雅上下线的设计与实践。 Spring Cloud提供了多种组件来实现服务的配置、路由、监控、熔断等可以通过监听 ContextClosedEvent 事件来实现优雅下线的逻辑。 Docker可以通过 Docker Stop 或 Docker Kill 命令来停止容器前者会发送 SIGTERM 信号给容器的 PID1 进程后者会发送 SIGKILL 信号。如果程序能响应 SIGTERM 信号就可以实现优雅下线的操作。 Spring Cloud 优雅下线的原理 ContextClosedEvent 是 Spring 容器在关闭时发布的一个事件可以通过实现 ApplicationListener 接口来监听这个事件并在 onApplicationEvent 方法中执行一些自定义的逻辑。 对于 Spring Cloud 中的微服务来说当收到 ContextClosedEvent 事件时可以做以下几件事情 从注册中心注销当前服务这样就不会再有新的请求进入。 拒绝或者延迟新的请求这样就可以保证正在处理的请求不会被中断。 等待一段时间让旧的请求处理完毕或者超时。 关闭服务释放资源。 这样就可以实现优雅下线的逻辑避免因为服务的变更而造成流量的中断或错误。 Spring Boot 优雅下线的 Demo 在旧版本里面我们需要实现 TomcatConnectorCustomizer 和 ApplicationListener接口然后就可以在 Customize 方法中获取到 Tomcat 的 Connector 对象并在 onApplicationEvent 方法中监听到 Spring 容器的关闭事件。 在2.3及以后版本我们只需要在 application.yml 中添加几个配置就能启用优雅关停了。 # 开启优雅停止 Web 容器默认为 IMMEDIATE立即停止server:shutdown: graceful# 最大等待时间spring:lifecycle:timeout-per-shutdown-phase: 30s这个开关的具体实现逻辑在我们在 GracefulShutdown 里。 然后我们需要添加 Actuator 依赖然后在配置中暴露 Actuator 的 Shutdown 接口。 # 暴露 shutdown 接口management:endpoint:shutdown:enabled: trueendpoints:web:exposure:include: shutdown这个时候我们调用 http://localhost:8080/actuator/shutdown 就可以执行优雅关停了它会返回如下内容 {message: Shutting down, bye...}优缺点 我觉得这种方法有以下的优点和缺点 优点 简单易用只需要实现两个接口就可以实现优雅下线的逻辑。 适用于 Tomcat 作为内嵌容器的 Spring Boot 应用不需要额外的配置或依赖。 可以保证正在处理的请求不会被中断而新的请求不会进入避免了服务的变更造成流量的中断或错误。 缺点 只适用于 Tomcat 作为内嵌容器的 Spring Boot 应用如果使用其他的容器或部署方式可能需要另外的实现。 需要等待一定的时间让正在处理的请求完成或超时这可能会影响服务的停止速度和资源的释放。 如果正在处理的请求过多或过慢可能会导致线程池无法优雅地关闭或者超过系统的终止时间造成强制关闭。 Docker 优雅下线的 Demo 这里用一个简单的 JS 应用来演示 Docker 实现无损下线的过程。 首先我们需要创建一个 Dockerfile 文件用于定义一个简单的应用容器代码如下 # 基于 node:14-alpine 镜像FROM node:14-alpine# 设置工作目录WORKDIR /app# 复制 package.json 和 package-lock.json 文件COPY package*.json ./# 安装依赖RUN npm install# 复制源代码COPY . .# 暴露 3000 端口EXPOSE 3000# 启动应用CMD [ node, app.js ]然后我们需要创建一个 app.js 文件用于定义一个简单的 Web 应用代码如下 // 引入 express 模块const express require(express);// 创建 express 应用const app express();// 定义一个响应 /hello 路径的接口app.get(/hello, (req, res) {// 返回 Hello, I am app 字符串res.send(Hello, I am app);});// 监听 3000 端口app.listen(3000, () {// 打印日志信息console.log(App listening on port 3000);});接下来我们需要在终端中执行以下命令来构建和运行我们的应用容器并查看页面结果。 # 构建镜像命名为 app:1.0.0docker build -t app:1.0.0 .# 运行容器命名为 app-1映射端口为 3001:3000docker run -d --name app-1 -p 3001:3000 app:1.0.0# 查看容器运行状态和端口映射信息docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESa8a9f9f7c6c4 app:1.0.0 docker-entrypoint.s… 10 seconds ago Up 9 seconds 0.0.0.0:3001-3000/tcp app-1# 在浏览器中访问 http://localhost:3001/hello 可以看到返回 Hello, I am app 字符串这个时候假设我们要发布一个新版本的应用我们需要修改 app.js 文件中的代码把返回的字符串修改为 “Hello, I am app v2”。 然后我们需要在终端中执行以下命令来构建和运行新版本的应用容器 # 构建镜像命名为 app:2.0.0docker build -t app:2.0.0 .# 运行容器命名为 app-2映射端口为 3002:3000docker run -d --name app-2 -p 3002:3000 app:2.0.0# 查看容器运行状态和端口映射信息docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESb7b8f8f7c6c4 app:2.0.0 docker-entrypoint.s… 10 seconds ago Up 9 seconds 0.0.0.0:3002-3000/tcp app-2a8a9f9f7c6c4 app:1.0.0 docker-entrypoint.s… 2 minutes ago Up 2 minutes 0.0.0.0:3001-3000/tcp app-1# 在浏览器中访问 http://localhost:3002/hello 可以看到返回 Hello, I am app v2 字符串接下来需要优雅地下线旧版本的应用容器让它完成正在处理的请求然后停止接收新的请求最后退出进程。 # 向旧版本的应用容器发送 SIGTERM 信号让它优雅地终止docker stop app-1# 查看容器运行状态和端口映射信息docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESb7b8f8f7c6c4 app:2.0.0 docker-entrypoint.s… 2 minutes ago Up 2 minutes 0.0.0.0:3002-3000/tcp app-2# 在浏览器中访问 http://localhost:3001/hello 可以看到无法连接到服务器的错误这样我们就实现了通过 Docker 来做优雅下线的过程保证正在处理的请求不会被中断而新的请求会被路由到新版本的应用上。 这里主要用到了 Docker Stop 命令。Docker Stop 命令会向容器发送 SIGTERM 信号这是一种优雅终止进程的方式它会给目标进程一个清理善后工作的机会比如完成正在处理的请求释放资源等。如果目标进程在一定时间内默认为 10 秒没有退出Docker Stop 命令会再发送 SIGKILL 信号强制终止进程。 所以使用 Docker Stop 命令能实现优雅下线的前提是容器中的应用能够正确地响应 SIGTERM 信号并在收到该信号后执行清理工作。如果容器中的应用忽略了 SIGTERM 信号或者在清理工作过程中出现异常那么 Docker Stop 命令就无法实现优雅下线的效果。 让容器中的应用正确地响应 SIGTERM 信号的方法主要取决于容器中的 1 号进程是什么以及它如何处理信号。如果容器中的 1 号进程就是应用本身那么应用只需要在代码中为 SIGTERM 信号注册一个处理函数用于执行清理工作和退出进程。例如在 Node.js 中可以这样写 // 定义一个处理 SIGTERM 信号的函数function termHandler() {// 执行清理工作console.log(Cleaning up...);// 退出进程process.exit(0);}// 为 SIGTERM 信号注册处理函数process.on(SIGTERM, termHandler);北极星的优雅下线 北极星的心跳默认是5秒维持一次客户端的缓存默认是2秒刷新一次。理论上在极致情况下服务下线会有2秒的不可用时间。但客户端都有重试机制且大部分客户端的超时时间都是大于2秒的。因此大部分情况下服务在北极星下线是不会造成业务感知的。 北极星的优雅下线有多种方式。其中上面的 Spring Boot 与 Docker 的方式是其中两种。 另外一种是可以在服务下线的时候在 PreStop 的时候去做服务隔离与反注册。 这样的隔离操作可以手动做也可以通过脚本来自动做。 [外链图片转存中…(img-SxCnVoCD-1689158362089)] 如上图被隔离的实例将不会被主调方发现这样就不会有新的需求进来在处理完成现有的请求后就可以执行下线操作了。 总结 优雅上下线的价值 在微服务实践中实现优雅上下线能给我们带来以下好处 最小化服务中断通过优雅上下线可以最小化服务中断的时间和影响范围从而确保服务的可用性和稳定性。 避免数据丢失优雅下线可以确保正在处理的请求能够完成避免数据丢失和请求失败。 提高用户体验优雅上下线可以确保用户在使用服务时不会遇到任何中断或错误从而提高用户体验和满意度。 简化部署流程通过使用自动化工具和流程可以简化部署流程减少人工干预和错误提高部署效率和质量。 提高可维护性通过使用监控和日志记录工具可以及时发现和解决问题提高服务的可维护性和可靠性。 这些好处可以帮助企业提高服务质量和效率提升用户满意度和竞争力。 优雅上下线的挑战 但同时优雅上下线也面临一些挑战 复杂性增加微服务架构通常由多个服务组成每个服务都有自己的生命周期和依赖关系因此优雅上下线需要考虑多个服务之间的交互和协调增加了系统的复杂性。 部署流程复杂优雅上下线需要使用自动化工具和流程这需要投入大量的时间和资源来构建和维护增加了部署流程的复杂性。 数据一致性问题优雅下线需要确保正在处理的请求能够完成但这可能会导致数据一致性问题需要采取措施来解决这个问题。 人员技能要求高微服务架构需要具备更高的技术水平和技能需要拥有更多的开发和运维经验这对企业的人员要求较高。 综上所述企业需要认真考虑这些挑战并采取相应的措施来解决这些问题以确保在微服务实践中更好的落地优雅上下线。
http://www.zqtcl.cn/news/819750/

相关文章:

  • 可以做外链的网站有哪些外贸阿里巴巴国际站
  • 潮安区住房和城乡建设局网站网站开发技术分析
  • 网站跳出率因素建设单位应该关注的网站
  • php开发的大型金融网站有哪些网站开发可以自学吗
  • 个人建网站成本wordpress 增加阅读量
  • wordpress构建自己的网站大连网站建设主页
  • 棋牌网站开发工程师网站app制作费用单
  • 为什么做网站比app便宜精准营销服务
  • 网站平台做捐助功能有风险吗wordpress博客 翻墙
  • 泰州网站建设专业团队长沙seo顾问
  • 网站建设情况简介seo的基本步骤顺序正确的是
  • wordpress 文件目录结构关键字优化价格
  • 连云港网站关键字优化市场网站 设计 文档
  • 哈尔滨企业建站服务商龙岩建筑网
  • 四川住房城乡建设厅官方网站中国建设银行在网站怎么签约
  • wordpress tortuga安徽seo网站
  • 厦门商务网站建设网络规划与设计实用教程
  • win8风格门户网站已经建网站做外贸
  • 自己有域名如何做网站wordpress文章中外链
  • 网站模糊背景加快网站速度吗
  • 网站设计软件下载在线观看免费网站网址
  • 关于网站开发的文章wordpress+直接连接数据库
  • 清华紫光网站建设怎样做团购网站
  • 诸城网站建设费用网站建设便捷
  • 丰台网站建设联系方式全屋定制十大名牌口碑
  • mip网站模板中国建设集团门户网站
  • 笑话 语录用什么网站做搜一搜百度
  • 合肥网站建设新闻营销影视类网站建设
  • 焦作有网站建设公司c 转网站开发
  • 化妆品网站建设报告邯郸在哪个省