基于 Spring Cloud 的微服务脚手架

作者: Grey

原文地址:

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

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

本文主要介绍了基于 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 实战

最新文章

  1. ASP.NET WebApi 文档Swagger深度优化
  2. 什么是WebPack,为什么要使用它?
  3. C#获取CPU占用率、内存占用、磁盘占用、进程信息
  4. BZOJ1098: [POI2007]办公楼biu
  5. hdu 5241 数学题= =
  6. UVA 10391 stl
  7. opencv笔记1:opencv的基本模块,以及环境搭建
  8. 对Java中字符串的进一步理解
  9. Android的startActivityForResult()与onActivityResult()与setResult()参数分析,activity带参数的返回
  10. el 和 fmt 常用
  11. powershell查看pc信息的常用命令
  12. sql新增后返回主键
  13. linux tomcat服务器优化配置
  14. (15)IO流之File
  15. 初次使用git配置以及git如何使用ssh密钥(将ssh密钥添加到github)
  16. 网卡name-eth1如何修改为eth0
  17. 基于Java SE集合的充值管理系统
  18. String之常量池小结
  19. ASP.NET Core部署在IIS上
  20. 微信小程序开发教程 #043 - 在小程序开发中使用 npm

热门文章

  1. PAT (Basic Level) Practice 1010 一元多项式求导 分数 25
  2. 使Squashfs可写的办法
  3. React魔法堂:echarts-for-react源码略读
  4. 20220728 - DP训练 #1
  5. day01-3-界面显示&amp;用户登录&amp;餐桌状态显示
  6. 44.drf缓存
  7. maven-入门到入土
  8. .NET周报【11月第1期 2022-11-07】
  9. fltp备份文件后统计验证
  10. ValidList