基于 Spring Cloud 的微服务脚手架
基于 Spring Cloud 的微服务脚手架
作者: Grey
原文地址:
本文主要介绍了基于 Spring Cloud Finchley 和 Spring Boot 2.0.x 版本的微服务脚手架的搭建和关键代码说明,参考了重新定义 Spring Cloud 实战。
相关组件和版本
| 组件 | 版本 | 备注 |
|---|---|---|
| Spring Boot | 2.0.9.RELEASE | - |
| Spring Cloud | Finchley.SR4 | - |
| JDK | 1.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 协议 |
架构图如下

启动方式,按如下顺序启动
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: chunked
Spring
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: chunked
zhudeming-dev
核心代码说明
上述三个方法在成功调用之前,都需要做鉴权逻辑
用户鉴权部分,实现HandlerInterceptor即可,在preHandle中处理鉴权逻辑
public class UserContextInterceptor implements HandlerInterceptor {
@Override
public 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 {
……
@Override
public 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);
@Override
public 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-CONFIG
application:
name: sc-configserver
代码地址
microservice-skeleton, tag: finchley.sr4
参考资料
基于 Spring Cloud 的微服务脚手架的更多相关文章
- 基于Spring Cloud的微服务入门教程
(本教程的原地址发布在本人的简书上:http://www.jianshu.com/p/947d57d042e7,若各位看官有什么问题或不同看法请在这里或简书留言,谢谢!) 本人也是前段时间才开始接触S ...
- 干货|基于 Spring Cloud 的微服务落地
转自 微服务架构模式的核心在于如何识别服务的边界,设计出合理的微服务.但如果要将微服务架构运用到生产项目上,并且能够发挥该架构模式的重要作用,则需要微服务框架的支持. 在Java生态圈,目前使用较多的 ...
- 基于Spring Cloud的微服务落地
微服务架构模式的核心在于如何识别服务的边界,设计出合理的微服务.但如果要将微服务架构运用到生产项目上,并且能够发挥该架构模式的重要作用,则需要微服务框架的支持. 在Java生态圈,目前使用较多的微服务 ...
- 基于 Spring Cloud 的微服务架构实践指南(下)
show me the code and talk to me,做的出来更要说的明白 本文源码,请点击learnSpringCloud 我是布尔bl,你的支持是我分享的动力! 一.引入 上回 基于 S ...
- 基于 Spring Cloud 的微服务架构实践指南(上)
show me the code and talk to me,做的出来更要说的明白 GitHub 项目learnSpringCloud同步收录 我是布尔bl,你的支持是我分享的动力! 一. 引入 上 ...
- 画了一张基于Spring Cloud的微服务系统架构图
- Cola Cloud 基于 Spring Boot, Spring Cloud 构建微服务架构企业级开发平台
Cola Cloud 基于 Spring Boot, Spring Cloud 构建微服务架构企业级开发平台: https://gitee.com/leecho/cola-cloud
- 基于Spring Boot和Spring Cloud实现微服务架构学习
转载自:http://blog.csdn.net/enweitech/article/details/52582918 看了几周Spring相关框架的书籍和官方demo,是时候开始总结下这中间的学习感 ...
- 基于Spring Boot和Spring Cloud实现微服务架构学习--转
原文地址:http://blog.csdn.net/enweitech/article/details/52582918 看了几周spring相关框架的书籍和官方demo,是时候开始总结下这中间的学习 ...
- 基于Spring Boot和Spring Cloud实现微服务架构
官网的技术导读真的描述的很详细,虽然对于我们看英文很费劲,但如果英文不是很差,请选择沉下心去读,你一定能收获好多.我的学习是先从Spring boot开始的,然后接触到微服务架构,当然,这一切最大的启 ...
随机推荐
- Android EGL 实践
本项目为 SurfaceView 和 TextureView 封装了 EGL 环境管理以及 Render 线程,可以和 GLSurfaceView 一样使用 OpenGLES 进行渲染.并尝试使用 O ...
- 《吐血整理》高级系列教程-吃透Fiddler抓包教程(25)-Fiddler如何优雅地在正式和测试环境之间来回切换-下篇
1.简介 在开发或者测试的过程中,由于项目环境比较多,往往需要来来回回地反复切换,那么如何优雅地切换呢?宏哥今天介绍几种方法供小伙伴或者童鞋们进行参考. 2.实际工作场景 2.1问题场景 (1)已发布 ...
- 学习ASP.NET Core Blazor编程系列五——列表页面
学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 学习ASP.NET Core Blazor编程系 ...
- 一个C#开发者学习SpringCloud搭建微服务的心路历程
前言 Spring Cloud很火,很多文章都有介绍如何使用,但对于我这种初学者,我需要从创建项目开始学起,所以这些文章对于我的启蒙,帮助不大,所以只好自己写一篇文章,用于备忘. SpringClou ...
- Bert不完全手册9. 长文本建模 BigBird & Longformer & Reformer & Performer
这一章我们来唠唠如何优化BERT对文本长度的限制.BERT使用的Transformer结构核心在于注意力机制强大的交互和记忆能力.不过Attention本身O(n^2)的计算和内存复杂度,也限制了Tr ...
- springboot H2 linux下搭建使用
这次研究是H2数据库了,关键还是再Linux下进行搭建部署的,被这个数据库快弄死了弄了4天时间,现在大致可以用了,还有些细节需要修正. 我这边使用的是springboot集成模式.直接使用代码启停方式 ...
- 浅尝 ECDHE 协议流程
前言 ECDHE 我之前是听都没听过, 但是新业务需要对前后端通信进行加密, 经过大佬推荐才知道有这个东西, 经过几天的学习和踩坑, 才大致明白其流程和使用方式. 过程坎坷, 好在最后还是成功运用到了 ...
- SpringBoot自定义注解+异步+观察者模式实现业务日志保存
一.前言 我们在企业级的开发中,必不可少的是对日志的记录,实现有很多种方式,常见的就是基于AOP+注解进行保存,但是考虑到程序的流畅和效率,我们可以使用异步进行保存,小编最近在spring和sprin ...
- docker-compose编排启动LNMP
2-1.docker-compose启动php #生成php镜像 [root@rocky8 data]#vim /data/dockerfile/ubuntu_php/Dockerfile FRO ...
- Linux学习环境搭建流程
Linux学习环境搭建 Vmware安装 VMware下载:https://www.vmware.com/go/getworkstation-win 运行安装程序,该重启安装驱动就重启,不需要就下一步 ...