基于 Spring Cloud 的微服务脚手架

news/2024/9/23 6:29:00/

基于 Spring Cloud 的微服务脚手架

作者: Grey

原文地址:

博客园:基于 Spring Cloud 的微服务脚手架

CSDN:基于 Spring Cloud 的微服务脚手架

本文主要介绍了基于 Spring Cloud Finchley 和 Spring Boot 2.0.x 版本的微服务脚手架的搭建和关键代码说明,参考了重新定义 Spring Cloud 实战。

相关组件和版本

组件版本备注
Spring Boot2.0.9.RELEASE-
Spring CloudFinchley.SR4-
JDK1.8高于JDK 1.8会有兼容性问题
Eureka基于 Spring Cloud F 版注册中心
Zuul基于 Spring Cloud F 版网关
hystrix基于 Spring Cloud F 版熔断器
Spring Cloud Config基于 Spring Cloud F 版配置中心
Spring Cloud OpenFeign基于 Spring Cloud F 版用于服务之间的通讯,使用 HTTP 协议

架构图如下

img

启动方式,按如下顺序启动

  • skeleton-eureka-server

  • skeleton-config-server

  • skeleton-zuul-server

  • skeleton-hystrix-dashboard

  • skeleton-user-service

  • skeleton-data-service

测试三个请求,需要带上x-customs-user参数,否则会被拦截器拦截提示无权限。

GET http://localhost:7777/sc-user-service/getProviderData
Accept: application/json
x-customs-user: Spring

返回

HTTP/1.1 200 
Date: Sat, 17 Dec 2022 11:09:48 GMT
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked["Beijing Company","Shanghai Company","Shenzhen Company"
]
GET http://localhost:7777/sc-user-service/getContextUserId
Accept: application/json
x-customs-user: Spring

返回

HTTP/1.1 200 
Date: Sat, 17 Dec 2022 11:09:29 GMT
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunkedSpring
GET http://localhost:7777/sc-user-service/getDefaultUser
Accept: application/json
x-customs-user: Spring

返回

HTTP/1.1 200 
Date: Sat, 17 Dec 2022 11:08:54 GMT
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunkedzhudeming-dev

核心代码说明
上述三个方法在成功调用之前,都需要做鉴权逻辑

用户鉴权部分,实现HandlerInterceptor即可,在preHandle中处理鉴权逻辑


public class UserContextInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse respone, Object arg2) throws Exception {User user = new User(HttpConvertUtil.httpRequestToMap(request));if (StringUtils.isEmpty(user.getUserId()) && StringUtils.isEmpty(user.getUserName())) {log.error("the user is null, please access from gateway or check user info");return false;}UserContextHolder.set(user);return true;}
……
}

上述三个请求分别代表三种不同的逻辑处理方式,第一个请求首先是到 sc-user-service 服务,sc-user-service 通过 RestTemplate 方式直接调用 data-service 服务,核心代码如下


@Component
public class UserService implements IUserService {……@Overridepublic List<String> getProviderData() {List<String> result = restTemplate.getForObject("http://sc-data-service/getProviderData", List.class);return result;}
}

第二个方法getContextUserId是获取当前上下文用户,使用的是 Spring Cloud 自带的 Feign 客户端,请求 data-service,Feign 请求会被拦截,并把当前用户存在 ThreadLocal 中, data-service 从ThreadLocal 中拿到当前用户信息返回即可, 核心代码如下

public class UserContextInterceptor implements HandlerInterceptor {private static final Logger log = LoggerFactory.getLogger(UserContextInterceptor.class);@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse respone, Object arg2) throws Exception {User user = new User(HttpConvertUtil.httpRequestToMap(request));if (StringUtils.isEmpty(user.getUserId()) && StringUtils.isEmpty(user.getUserName())) {log.error("the user is null, please access from gateway or check user info");return false;}// 存当前用户UserContextHolder.set(user);return true;}
}

其中UserContextHolder.set(user)就是把当前用户存在ThreadLocal中。

public class UserContextHolder {public static ThreadLocal<User> context = new ThreadLocal<User>();public static User currentUser() {return context.get();}public static void set(User user) {context.set(user);}public static void shutdown() {context.remove();}}

第三个方法getDefaultUser同样是 sc-user-service 通过 Feign 客户端访问 data-service,但是用户是通过配置中心来获取(即:skeleton-config-server 项目作用)

@Component
@ConfigurationProperties(prefix = "cn.springcloud.book")
public class DataConfig {private String defaultUser;public String getDefaultUser() {return defaultUser;}public void setDefaultUser(String defaultUser) {this.defaultUser = defaultUser;}}
server:port: 9090
spring:cloud:config:server:git:uri: https://gitee.com/zhudeming/spring-cloud-config.git#username:#password:search-paths: SC-BOOK-CONFIGapplication:name: sc-configserver

代码地址

microservice-skeleton, tag: finchley.sr4

参考资料

重新定义 Spring Cloud 实战


http://www.ppmy.cn/news/4530.html

相关文章

皮带撕裂检测系统 yolo深度学习模型

皮带撕裂检测系统通过Python基于YOLOv7网络机器学习架构模型&#xff0c;对现场皮带撕裂实时分析检测。我们使用YOLO(你只看一次)算法进行对象检测。YOLO是一个聪明的卷积神经网络(CNN)&#xff0c;用于实时进行目标检测。该算法将单个神经网络应用于完整的图像&#xff0c;然后…

【华为OD机试真题2023 JAVA】寻找符合要求的最长子串

华为OD机试真题,2023年度机试题库全覆盖,刷题指南点这里 寻找符合要求的最长子串 知识点双指针 时间限制:1s 空间限制:256MB 限定语言:不限 题目描述: 给定一个字符串 s ,找出这样一个子串: 1)该子串中的任意一个字符最多出现2次; 2)该子串不包含指定某个字符; 请…

Promise学习

01_准备_函数对象VS实例对象.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>准备_函数对象 VS 实例对象</title> </head> <body> <script>/*函数对象 VS 实例对象1. 函…

jdk11新特性——更简化的编译运行程序

目录一、概述二、注意事项三、注意事项1——代码示例3.1、示例13.2、示例23.3、示例3四、注意事项2——代码示例4.1、示例14.2、示例2一、概述 JEP 330 : 增强java启动器支持运行单个java源代码文件的程序。 在我们的认知里面&#xff0c;要运行一个 Java 源代码必须先编译&am…

基于Java毕业设计新疆旅游专列订票系统源码+系统+mysql+lw文档+部署软件

基于Java毕业设计新疆旅游专列订票系统源码系统mysqllw文档部署软件 基于Java毕业设计新疆旅游专列订票系统源码系统mysqllw文档部署软件本源码技术栈&#xff1a; 项目架构&#xff1a;B/S架构 开发语言&#xff1a;Java语言 开发软件&#xff1a;idea eclipse 前端技术&a…

能够让你装逼的10个Python小技巧

列表推导式 你有一个list&#xff1a; bag [1, 2, 3, 4, 5] 现在你想让所有元素翻倍&#xff0c;让它看起来是这个样子&#xff1a; [2, 4, 6, 8, 10] 大多初学者&#xff0c;根据之前语言的经验会大概这样来做 bag [1, 2, 3, 4, 5] for i in range(len(bag)): bag[i] ba…

STM32 10个工程实战前言

从今年2022年元旦开通博客到现在基本接近一年了&#xff0c;真的会感到感觉时间飞逝&#xff0c;尤其当你全身心地投入一件工作上时&#xff0c;在FPGA基础篇和FPGA 20个经理例程篇后&#xff0c;又准备了STM32基础篇和STM32 10个工程实战篇&#xff0c;前两者即将收尾&#xf…

DCBC路由模式配置端口映射

DCBC路由模式配置端口映射 拓扑搭建 前提&#xff1a;使用DCBC、CS6200、两台PC机&#xff1a;一台用户配置IP另一台用于测试端口映射&#xff0c;外网环境使用192.168.19.0/24网段 网段划分 全网互通 1.DCBC对应工作模式配置 对应接口配置 配置静态路由两条&#xff0c;一条…