简单spring cloud服务升级实现

2023-11-19

1、升级原则

  • 隔离性:v1升级到v2时,相互独立,互不不干扰。
  • 稳定性:服务不停止,完成升级。接口保持畅通。

2、具体实现

2.1 eureka项目

搭建eureka,网上很多,就省略了。

2.2 feign接口项目

2.2.1 依赖

<project xmlns="http://maven.apache.org/POM/4.0.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>com.spring.cloud.pro</groupId>
		<artifactId>com.spring.cloud.pro</artifactId>
		<version>1.0.0.RELEASE</version>
	</parent>
	<artifactId>com.spring.cloud.pro.facade</artifactId>
	<description>接口</description>

	<dependencies>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-openfeign</artifactId>
		</dependency>
	</dependencies>
</project>

2.2.2 接口定义

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

import com.spring.pro.model.User;

/**   
 * @Title: UserFacade.java 
 * @ProjectName com.spring.cloud.pro.facade
 * @Description:  
 * @author ybwei   
 * @date 2019年1月11日 下午4:18:09    
 */
@FeignClient("eureka-provider${version}") //name等于服务提供者的spring.application.name
public interface UserFacade {

	/**  
	 * @Description: 
	 * @Param: @param id
	 * @Param: @return
	 * @Param: @throws Exception
	 * @return: User
	 * @Author: ybwei
	 * @Date: 2019年1月11日 下午4:20:59
	 */ 
	@GetMapping("/getUser")
	public User getUser(@RequestParam("id") Integer id) throws Exception;
}
import lombok.Data;

/**   
 * @Title: User.java 
 * @ProjectName com.spring.cloud.pro.facade
 * @Description:  
 * @author ybwei   
 * @date 2019年1月11日 下午4:18:49    
 */
@Data
public class User {

	private Integer id;
	private String name;
	private Integer age;
	
}

2.3 生产者

2.3.1 依赖

<project xmlns="http://maven.apache.org/POM/4.0.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>com.spring.cloud.pro</groupId>
		<artifactId>com.spring.cloud.pro</artifactId>
		<version>1.0.0.RELEASE</version>
	</parent>
	<artifactId>com.spring.cloud.provider</artifactId>
	<version>1.0.1.RELEASE</version>
	<description>服务提供者</description>

	<dependencies>
		<dependency>
			<groupId>${project.parent.groupId}</groupId>
			<artifactId>com.spring.cloud.pro.facade</artifactId>
			<version>${project.parent.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-actuator</artifactId>
		</dependency>
	</dependencies>

	<build>
		<finalName>${project.artifactId}</finalName>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<executions>
					<execution>
						<goals>
							<goal>repackage</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
		</plugins>
	</build>
</project>

2.3.2 application.yml配置

version: '@project.version@' #项目版本
server:
  port: 8083
spring:
  application:
    name: eureka-provider${version}
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka
hystrix:
  command:
    default:
      execution:
        timeout:
          enabled: false #hystrix禁止超时设置 
  

2.3.3 代码

package com.spring.pro.controller;

import org.springframework.web.bind.annotation.RestController;

import com.spring.pro.facade.UserFacade;
import com.spring.pro.model.User;

/**   
 * @Title: UserController.java 
 * @ProjectName com.spring.cloud.provider
 * @Description:  
 * @author ybwei   
 * @date 2019年1月11日 下午4:25:19    
 */
@RestController
public class UserController implements UserFacade {

	@Override
	public User getUser(Integer id) throws Exception {
		User user=new User();
		user.setId(id);
		user.setName("李四");
		user.setAge(21);
		return user;
	}

}

2.4 消费者

2.4.1 依赖

<project xmlns="http://maven.apache.org/POM/4.0.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>com.spring.cloud.pro</groupId>
		<artifactId>com.spring.cloud.pro</artifactId>
		<version>1.0.0.RELEASE</version>
	</parent>
	<artifactId>com.spring.cloud.pro.consumer</artifactId>
	<version>1.0.1.RELEASE</version>
	<description>消费者</description>
	<dependencies>
		<dependency>
			<groupId>${project.parent.groupId}</groupId>
			<artifactId>com.spring.cloud.pro.facade</artifactId>
			<version>${project.parent.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-actuator</artifactId>
		</dependency>
	</dependencies>

	<build>
		<finalName>${project.artifactId}</finalName>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<executions>
					<execution>
						<goals>
							<goal>repackage</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
		</plugins>
	</build>
</project>

2.4.2 application.yml配置

version: '@project.version@' #项目版本
server:
  port: 8084
spring:
  application:
    name: eureka-consumer${version}
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka
feign: 
  hystrix:
    enabled: true #启用hystrix
hystrix:
  command:
    default:
      execution:
        timeout:
          enabled: false #hystrix禁止超时设置 

2.4.3 代码

package com.spring.pro.controller;

import javax.annotation.Resource;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import com.spring.pro.facade.UserFacade;
import com.spring.pro.model.User;

/**
 * @Title: UserController.java
 * @ProjectName com.spring.cloud.pro.consumer
 * @Description:
 * @author ybwei
 * @date 2019年1月11日 下午4:27:14
 */
@RestController
public class UserController {
	@Resource
	private UserFacade userFacade;

	@GetMapping("/getUser")
	public User getUser(Integer id) throws Exception {
		return userFacade.getUser(id);
	}
}

3、说明

3.1 核心逻辑

消费者调用的的生产者是spring.application.name+版本号。

3.2 升级过程

当系统进行从v1升级到v2:

  1. 项目的生产者、消费者项目版本号升级。v1升为v2。项目的生产者、消费者项目版本号保持一致。
  2. 生产者的50%升级到v2版本。如果全部升级,v1版本消费者都会失败。
  3. 消费者全部升级到v2版本。
  4. 生产者全部升级到v2版本。

注意:示例中生产者、消费者项目使用的pom.xml中的版本号,也可以使用常量(如1.0),只要保持两者一致即可。

3.3 适用场景

  • 接口v1版本与v2版本不兼容时,app强制更新,适用。
  • 接口v1版本与v2版本兼容,app不需要更新,适用。

3.4 版本控制

3.4.1 命名规范

参考软件版本命名规范

3.4.2 注意

多团队开发时,版本号尽量由一个人来控制,避免冲突。同一天上线,为统一版本号。不同时间上线为不同版本号。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

简单spring cloud服务升级实现 的相关文章

随机推荐

  • python笔记2--python 中安装package注意事项

    python笔记2 python 中安装package注意事项 使用python时候 经常需要安装相关的包 安装方法包括两种 1 直接使用easy install或者pip安装 2 下载package源码安装 1 直接使用easy inst
  • macbook上的vim怎么设置语法高亮和显示行号

    在我写这篇文章之前我的vim就很普通 没有语法高亮 无法显示行号 但是我通过在网上不断查阅一些处理方法和经验之后 我终于能将我MacBook电脑上的vim配置出语法高亮和显示行号了 作为一名乐于分享 乐于助人的新手程序员 我决定把我的解决办
  • 《Web应用安全权威指南》学习笔记

    第1章 什么是Web应用的安全隐患 第2章 搭建试验环境 邮件发送服务器Postfix POP3服务器Dovecot SSH服务器OpenSSH Web应用调试工具Fiddler 第3章 Web安全基础 HTTP回话管理 同源策略 Cook
  • k8s安全04--kube-apiserver 安全配置

    k8s安全04 kube apiserver 安全配置 1 介紹 2 安全配置 2 1 配置 insecure port 2 2 RBAC 2 3 Service Accounts 2 4 Researching Pod Security
  • Nginx 无法转发本地端口

    问题描述 本文主要分析解决 centos 下 nginx 配置端口转发后不生效 通过 nginx 配置 server 转发后 无法达到预期的转发目的 并出现502错误的问题 假设虚拟机 ip 为 192 168 0 8 并且在虚拟机内部署一
  • ISO七层模型

    物理层 O S I 模型的最低层或第一层 该层包括物理连网媒介 如电缆连线连接器 物理层的协议产生并检测电压以便发送和接收携带数据的信号 在你的桌面P C 上插入网络接口卡 你就建立了计算机连网的基础 换言之 你提供了一个物理层 尽管物理层
  • uni-app项目在微信开发者工具打开时报错[ app.json 文件内容错误] app.json: 在项目根目录未找到 app.json

    uni app项目在微信开发者工具打开时控制台报错 app json 文件内容错误 app json 在项目根目录未找到 app json env Windows mp 1 06 2303220 lib 2 32 0 解决方案 以下是一个u
  • 前端基础之ES6

    1 前后端对比 2 ES6 ECMAScript6 0 以下简称ES6 ECMAScript是一种由Ecma国际通过ECMA 262标准化的脚本 是JavaScript语言的下一代标准 2015年6月正式发布 从ES6开始的版本号采用年号
  • S-DES加密

    S DES加密 Simplified Data Encryption Standard S DES 是一个供教学的非安全的加密算法 它与DES的特性和结构类似 但参数小 明文分组为8位 主密钥分组为10位 采用两轮迭代 S DES加密过程包
  • 第十一讲、FPGA开发中xilinx vivado 平台时序分析系列课程-边沿对齐input delay ddr双沿采样时序约束与收敛

    我们在使用一些以太网PHY和FPGA接口是RGMII接口是DDR双沿结构 还有ADC芯片也也是DDR双沿采样接口 以及CMOS视频传感器也有很多DDR双沿源同步接口 我们这里以IMX222视频传感器的的DDR为例约束input ddr 接口
  • FPGA提示产生latch的报错

    在fpga的设计中有时会遇到 latch 的报错 1 latch是什么 Latch 就是锁存器 是一种在异步电路系统中 对输入信号电平敏感的单元 用来存储信息 锁存器在数据锁存使能时 数据被锁存 输入信号不起作用 这违背了组合逻辑中输出随输
  • selenium元素定位方法 id,name,class

    1 导入selenium from selenium import webdriver from time import sleep 2 打开浏览器 最大化 driver webdriver Chrome driver maximize w
  • Java 学习路线大全,再也不用迷路啦(持续更新)

    路线特点 最新 完整一条龙 从入门到入土 表示推荐学习 给出目标 学习建议 关键知识点 最优资源以及各类资源推荐 视频 书籍 文档 项目 工具等 划分阶段 更有计划 且在最后给出持续学习的方向 探索 Java 程序员发展的无限可能 前言 首
  • SQLSERVER排查CPU占用高的情况

    一般排查都是用下面的脚本 一般会用到三个视图 sys sysprocesses dm exec sessions dm exec requests sys sysprocesses 系统表是一个很重要的系统视图 主要用来定位与解决Sql S
  • 存储类型auto,static,extern,register的区别 <转>

    变量和函数的属性包括数据类型和数据的存储类别 存储类别指数据在内存中存储方式 静态和动态 包含auto static register extern四种 内存中 具体点来说内存分为三块 静态区 堆区 栈区 外部变量和全局变量存放在静态区 局
  • 半监督学习——数据精馏(论文阅读)

    论文地址 https arxiv org pdf 1712 04440 pdf 1 论文与摘要 Data Distillation Towards Omni Supervised Learning 摘要 作者提出一种特殊的半监督学习方法 取
  • android 最新动态,浅谈Android动态页面(一)

    这是一个很微妙的东西 可能平时经常用到 但是没注意 我想对这个内容进行一个总结并提出一些看法 谈的是动态页面 不是动态布局 一 什么是动态页面 什么是动态页面 我认为是一种在开发时的设计思想 最终展示的页面会随着数据的改变而改变 或者说会根
  • OpenCV中如何读取URL图像文件

    点击上方 小白学视觉 选择加 星标 或 置顶 重磅干货 第一时间送达 由来 最近知识星球收到的提问 觉得是一个很有趣的问题 就通过搜集整理归纳了一番 主要思想是通过URL解析来生成数据 转为图像 Mat对象 但是在Python语言与C 语言
  • Java基础学习总结(1)——equals方法

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 一 equals方法介绍 1 1 通过下面的例子掌握equals的用法 1 package cn galc test 2 3 public class TestEquals
  • 简单spring cloud服务升级实现

    1 升级原则 隔离性 v1升级到v2时 相互独立 互不不干扰 稳定性 服务不停止 完成升级 接口保持畅通 2 具体实现 2 1 eureka项目 搭建eureka 网上很多 就省略了 2 2 feign接口项目 2 2 1 依赖