zuul怎么请与网络管理员联系请求访问权限权限认

Spring OAuth2 登录成功后跳转到原来的地址
本文介绍基于Spring Cloud Zuul实现的OAuth2 Clinet在跳转到OAuth2 Server的登录页面成功登录后如何redirect跳转回原来的地址,即redirect back to origin url after login successfully.
Spring OAuth SSO的基本过程有以下几步:
用户访问网站,打开了一个链接(origin url) ;
访问请求发送给Zuul Gateway服务器(该服务器同时也是OAuth2 Client),服务器判断该请求是否访问了受保护的资源;
如果是访问受保护的资源则判断登录状态,没有登录则重定向到OAuth2 Server的登录页面;
用户输入账户信息进行登录,登录成功后将用户信息保持在Spring Security Context中并进行页面跳转。
由于之前系统框架中只有一个客户端,而且我们的客户端是基于Vue的单页面应用,所以就在OAuth2 Server中直接配置了一个登录成功后的默认地址。最近需要增加一个客户端,在使用同一个OAuth2 Server作为统一登录时就面临着必须让用户从哪里来回哪里去的问题!经过查阅文档和跟踪调试,OAuth2 Client在检测到用户未登录访问受保护的资源时会直接redirect到OAuth2 Server,redirect的url是基于OAuth2 Client配置的security.oauth2.client.user-authorization-uri和security.oauth2.client.client-id进行拼接而成的,如下所示:
http://127.0.0.1:8080/auth/oauth/authorize?client_id=oauth2_client_id&redirect_uri=http://127.0.0.1/login&response_type=code&state=B5c3xa
除了这段redirect url中的数据之外,OAuth2 Client没有再给OAuth2 Server任何其他数据,所以我需要将origin url作为query string参数放到这段redirect url里面去。解决方案分为三步:
在OAuth2 Client中获取到origin url并在组装oauth2的redirect url时添加到query string中传递给OAuth2 Server;
OAuth2 Server在自己的LoginSuccessHandler中从request session中拿出SPRING_SECURITY_SAVED_REQUEST获取到redirect url并解析出original url;
response.sendRedirect(originUrl)
基于spring cloud zuul gateway的OAuth2 Client配置:
重写LoginUrlAuthenticationEntryPoint将origin url保存在session中;
重写DefaultRedirectStrategy将session中的origin url拼接在redirect url中
* UI代理服务器,基于zuul的 oauth2 client.
@SpringBootApplication
@EnableOAuth2Sso
@EnableZuulProxy
public class UIProxyApplication extends WebSecurityConfigurerAdapter{
public static void main(String[] args) {
SpringApplication.run(UIProxyApplication.class, args);
protected void configure(HttpSecurity http) throws Exception {
System.out.println(logoutUrl);
http.exceptionHandling().authenticationEntryPoint(new UnauthorizedEntryPoint("/login"));
http.authorizeRequests()
.antMatchers("/login", "/api/**").permitAll()
.anyRequest().authenticated()
.and().csrf().disable()
public LogoutHandler logoutHandler() {
return new MyLogoutHandler();
public FilterRegistrationBean oauth2ClientFilterRegistration(
OAuth2ClientContextFilter filter) {
FilterRegistrationBean registration = new FilterRegistrationBean();
filter.setRedirectStrategy(new OAuthRedirectStrategy());
registration.setFilter(filter);
registration.setOrder(-100);
class OAuthRedirectStrategy extends DefaultRedirectStrategy {
public void sendRedirect(HttpServletRequest request, HttpServletResponse response, String url) throws IOException {
String redirectUrl = calculateRedirectUrl(request.getContextPath(), url);
redirectUrl = response.encodeRedirectURL(redirectUrl);
if (logger.isDebugEnabled()) {
logger.debug("Custom BMA SecurityConfiguration Redirecting to '" + redirectUrl + "'");
String requestUrl = request.getSession().getAttribute("requestUrl").toString();
redirectUrl += "&request_url=" + requestU
response.sendRedirect(redirectUrl);
public class UnauthorizedEntryPoint extends LoginUrlAuthenticationEntryPoint {
public UnauthorizedEntryPoint(String loginFormUrl) {
super(loginFormUrl);
public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException {
request.getSession().setAttribute("requestUrl", request.getRequestURL());
super.commence(request, response, authException);
OAuth2 Server的LoginSuccessHandler处理redirect url并redirect到origin url
public class LoginSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler {
public void onAuthenticationSuccess(HttpServletRequest request,
HttpServletResponse response, Authentication authentication) throws IOException,
ServletException {
Object principal = authentication.getPrincipal();
String username = "";
if (principal instanceof UserDetails) {
username = ((UserDetails) principal).getUsername();
username = principal.toString();
if (request.getSession().getAttribute("SPRING_SECURITY_SAVED_REQUEST") != null) {
String savedRequest = request.getSession().getAttribute("SPRING_SECURITY_SAVED_REQUEST").toString();
String[] params = savedRequest.split("&");
for (int i = 0; i & params. i++) {
if (params[i].indexOf("request_url") != -1) {
String requestUrl = params[i].split("=")[1].split("]")[0];
response.sendRedirect(requestUrl);
super.onAuthenticationSuccess(request, response, token);
OAuth2 Server中配置LoginSuccessHandler
* 安全配置类
@Configuration
@EnableWebSecurity
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {
protected void configure(HttpSecurity httpSecurity) throws Exception {
httpSecurity
.authorizeRequests().antMatchers(
"/login/**",
"/css/**",
"/img/**").permitAll()
.anyRequest().authenticated()
.and().formLogin().loginPage("/login").permitAll()
.and().csrf().disable()
httpSecurity.addFilter(myUsernamePasswordAuthenticationFilter());
FilterRegistrationBean forwardedHeaderFilter() {
FilterRegistrationBean filterRegBean = new FilterRegistrationBean();
filterRegBean.setFilter(new ForwardedHeaderFilter());
filterRegBean.setOrder(Ordered.HIGHEST_PRECEDENCE);
return filterRegB
public UsernamePasswordAuthenticationFilter myUsernamePasswordAuthenticationFilter() throws Exception{
MyUsernamePasswordAuthenticationFilter filter = new MyUsernamePasswordAuthenticationFilter();
filter.setAuthenticationManager(authenticationManager());
filter.setAuthenticationSuccessHandler(loginSuccessHandler());
public LoginSuccessHandler loginSuccessHandler() {
return new LoginSuccessHandler();
一些说明:
OAuth2是基于JWT 的,相关配置没有在这里给出;
增加UsernamePasswordAuthenticationFilter和LoginSuccessHandler是原有项目需求,不是为了这次的跳转才加的;
这个方法可能还不是common practise,有更好的方法欢迎交流!
OAuth 漏洞预警 (OAuth平台redirect_uri 漏洞), 说说如何修补
耗子写了篇关于 oauth 的文章,其中第二个bug没有看懂。翻了原文又翻了规范,后来才想通。
原文是 Bug 2. Lack of redirect_uri validation on get-...
user/login.do isn't a valid redirect URL
使用视图解析器解决Circular view path 问题
在对应方法上加@ResponseBody注解。
摘要:今天来给大家分享一下期待已久的oauth2回调地址的设置,相信接触过oauth2的很多coder已经按捺不住激动的心情了吧。因为这个回调地址的配置能够让授权码模式的运用的主动权掌握在自己的手中,...
SSO即Single Sign-On,单点登录,即授权服务器形式,通过在一个网站上登录完后,给予过授权的就可以直接用这个帐号信息登录了,类似于qq微信登录其他APP。
本篇文章,将利用Spring ...
spring securtiy配置、下载,security权限管理,javaweb权限管理
在对mvc进行测试时,即便指定了配置文件中的视图解析依然没有作用,测试时会报异常:...
一直很困惑这中spring security 的链式的httpSecurity怎么配置,以下是笔记
来着stackoverflow
没有更多推荐了,1. Github项目地址 https://github.com/zengzhen1994/springboot-learning (选择Springcloud/Springcloud-learning-2)
2. 准备工作
2.1 Eureka服务器用来注册服务,如果还没有搭建,
2.2 准备两个服务提供者,分别在端口78,79
2.3 开启服务提供者和Eureka服务器,访问 http://localhost:81/ 如图表示服务注册成功
3. Zuul服务网关搭建
在之前的pom.xml中加入zuul所需的jar包,如下
&dependency&
&groupId&org.springframework.cloud&/groupId&
&artifactId&spring-cloud-starter-zuul&/artifactId&
&/dependency&编写一个zuul过滤器,用来控制权限。每次发送请求的时候都需要一个token,如果没有token就没有权限,在被路由之前过滤器就会自动拦截掉返回401错误。package com.zz.springcloud.
import com.netflix.zuul.ZuulF
import com.netflix.zuul.context.RequestC
import javax.servlet.http.HttpServletR
public class Filter extends ZuulFilter
* 返回一个字符串代表过滤器的类型
* pre表示被路由之前
public String filterType() {
return "pre";
* 过滤顺序
public int filterOrder() {
public boolean shouldFilter() {
public Object run() {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
String accessToken = String.valueOf(request.getParameter("Token"));
if(!accessToken.equals("zz")) {
ctx.setSendZuulResponse(false);
ctx.setResponseStatusCode(401);
}写完过滤器之后,以bean的形式导入到主程序,并开启zuul网关服务。
package com.zz.
import org.springframework.boot.builder.SpringApplicationB
import org.springframework.cloud.client.SpringCloudA
import org.springframework.cloud.netflix.zuul.EnableZuulP
import org.springframework.context.annotation.B
import com.zz.springcloud.zuulfilter.F
@EnableZuulProxy
@SpringCloudApplication
public class GateWayApplication {
public static void main(String[] args) {
new SpringApplicationBuilder(GateWayApplication.class).web(true).run(args);
public Filter getFilter() {
return new Filter();
}到这里,网关服务和权限过滤就搭建好了。还需要更改配置,让zuul去管理各个服务。
修改application.properties如下
spring.application.name=Service-Gateway
server.port=100
# routes to service1
zuul.routes.service1.path=/service-1/**
zuul.routes.service1.serviceId=eureka-service-1
# routes to service2
zuul.routes.service2.path=/service-2/**
zuul.routes.service2.serviceId=eureka-service-2
eureka.client.serviceUrl.defaultZone=http://localhost:81/eureka/serviceId指向你之前建立服务的application name,这样就可以通过链接映射到服务上,启动网关
4. 运行演示
4.1 发送请求到service-1(不带token):http://localhost:100/service-1/plus?number=0
由于没有权限,页面跳转401页面。
4.2 发送请求到service-1(带token):http://localhost:100/service-1/plus?number=1&Token=zz
4.3 发送请求给service-2(带token):http://localhost:100/service-2/plus?number=1&Token=zz
4.4 plus是我service里定义的rest接口,对应一个+1的方法。如果你自己定义了方法,改成了你的映射就可以了。
spring-cloud中使用shiro权限控制
在spring-cloud中使用shiro权限控制,分为网关权限控制和后台逻辑控制。注意:要在后台做权限认证,必须先在网关做身份认证,将身份认证信息使用redis跨域到后台。本教程的后台权限认证不会运...
SpringCloud系列:利用Zuul实现统一服务网关服务,简单实现IP白名单功能
本文基于SpringCloud Zuul实现统一网关服务、请求校验等功能,最后通过zuul过滤器实现IP白名单功能...
Spring Cloud下微服务权限方案
背景从传统的单体应用转型Spring Cloud的朋友都在问我,Spring Cloud下的微服务权限怎么管?怎么设计比较合理?从大层面讲叫服务权限,往小处拆分,分别为三块:用户认证、用户权限、服务校...
springcloud
zuul网关对微服务路由及权限的控制
1.eureka-server注册服务中心。
2.准备两个服务提供者,分别在端口
3.启动Eureka服务器和两个服务提供者,访问http://localh...
本文出自于EumJi的个人笔记,仅限于学习用途的转载,转载请注明出处 http://www.eumji025.com/article/details/253271
Zuul is t...
Spring Cloud Zuul (服务网关)
1.zuul的作用
1.1服务的统一入口
Zuul的主要功能是路由和过滤器。是各种服务的统一入口,同时还会用来提供监控、授权、安全、调度等等。
如上图所示,在无网关的情况下,...
SpringCloud学习笔记-zuul网关
SpringCloud zuul网关和网络拓补图结构, 讲解路由和拦截功能
Spring Cloud Zuul--服务网关
有了Eureka服务注册发现、Hystrix断路器、Ribbon服务调用负载均衡,以及spring cloud config 集群配置中心,似乎一个微服务框架已五脏俱全,last but not le...
Spring Cloud微服务(3)之网关Zuul
古语有云:一夫当关,万夫莫开。
网关Zuul就在系统中起到同样的作用,它是系统的门户、城市的关隘、公园的检票口。
服务网关API Gateway可以有很多实现方法,如Nginx、Zuul,甚...
没有更多推荐了,前面实现了简单的zuul服务,那么这样的情况下任何知道地址的人都可以直接来访问接口那么这边可以通过zuul的过滤器来进行权限控制一 : 这边定义了一个Zuul过滤器,实现了在请求被路由之前检查请求头中是否有ACCESS_TOKEN参数,有就放行,没有就执行拦截二 : 定义一个类继承ZuulFilterpackage cn.sh.daniel.
import com.netflix.zuul.ZuulF
public class ZuulAccessFilter extends ZuulFilter {
public boolean shouldFilter() {
public Object run() {
public String filterType() {
public int filterOrder() {
}filterType: 指定过滤器的类型1: pre 在请求被路由前调用,可以利用此过滤器来验证角色权限,记录请求日志2:routing: 这种过滤器将请求路由到微服务3:post 过滤器在路由到微服务后执行,这种过滤器用来添加响应的http header,收集统计信息,将响应从微服务发送到客户端4:error 在其他阶段发生错误时执行该过滤器filterOrder: 过滤器的执行顺序shouldFilter: 返回一个布尔值来表示此过滤器是否要执行,true执行,false不执行Run: 过滤器的具体逻辑三 : 重写具体的逻辑package cn.sh.daniel.
import javax.servlet.http.HttpServletR
import com.netflix.zuul.ZuulF
import com.netflix.zuul.context.RequestC
public class ZuulAccessFilter extends ZuulFilter {
public boolean shouldFilter() {
public Object run() {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
Object accessToken = request.getHeader("accessToken");
if (accessToken == null) {
ctx.setSendZuulResponse(false);
ctx.setResponseStatusCode(401);
public String filterType() {
return "pre";
public int filterOrder() {
}四 : 实例化过滤器package cn.sh.
import org.springframework.boot.SpringA
import org.springframework.boot.autoconfigure.SpringBootA
import org.springframework.cloud.netflix.zuul.EnableZuulP
import org.springframework.context.annotation.B
import cn.sh.daniel.zuul.ZuulAccessF
@SpringBootApplication
@EnableZuulProxy
//添加注解支持网关路由
public class CloudShopGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(CloudShopGatewayApplication.class, args);
public ZuulAccessFilter accessFilter() {
return new ZuulAccessFilter();
}五 : 启动网关服务测试1)请求头没有token的情况2)请求头有token的情况和预期的效果一致
Spring Cloud Zuul
基于Spring的微服务结点在能力上没有高低贵贱之分,但是在角色上会分为边缘服务和内部服务两部分。内部服务顾名思义是为对内暴露服务的结点,供架构内部来调用;边缘服务是对外部网络暴露的服务结点,也就是对...
spring cloud 使用 Zuul实现过滤器
Zuul实现过滤器
Netflix zuul作为API网关集成在spring cloud分布式集群中,是一个智能的应用服务器,对外暴露分布式中的请求调度和过滤,实现请求路由、负载均衡、...
1 Zuulservlet 装入tomcat容器
2 ZuulServlet源码
4 ZuulFilter 执行实现
 zuul 源码调用过程
1 Zuulservl...
zuul核心框架zuul是可以认为是一种API-Gateway。zuul的核心是一系列的filters, 其作用可以类比Servlet框架的Filter,或者AOP。其原理就是在zuul把Reques...
灰度发布、蓝绿发布、金丝雀发布各是什么意思,可以看这篇http://www.appadhoc.com/blog/product-release-strategy/。基于eureka、ribbon实现灰...
【说明】本篇博客建立在上一篇的基础之上,上篇博客请参考
在完成了服务路由之后,我们对外开放服务还需要一些安全措施来保护客户端只能访问它应该访问到的资源。所以我们需要利用Zuul的过滤器来实现...
1、官网翻译:
路由和过滤器:Zuul(Router andFilter: Zuul)
Routing in an integral part of a microservice archit...
spring cloud-zuul的Filter详解
在前面我们使用zuul搭建了网关http://blog.csdn.net/liuchuanhong1/article/details/
关于网关的作用,这里就不再次赘述了,我们今天的...
springCloud学习05之api网关服务zuul过滤器filter
前面学习了zuul的反向代理、负载均衡、fallback回退。这张学习写过滤器filter,做java web开发的对filter都不陌生,那就是客户端(如浏览器)发起请求的时候,都先经过过滤器fil...
没有更多推荐了,微服务的两套认证:
1.身份认证在zuul加filter拦截获取请求user token,校验user token合法性
2.服务认证为内部服务之间通过server token来校验服务调用的合法性
整个流程的大概逻辑:
1.启动认证服务(auth-server),此时会生成user的公钥私钥和服务server的公钥私钥
2.启动其他服务,启动后请求认证服务(auth-server)拿到对应的2套公钥,用于对2种token做解密认证用
整个调用请求通过zuul filter时校验token,zuul会通过启动时拿到的公钥对token认证,通过校验后可以在调用权限管理服务(permission-server)查询当前用户是否有访问此url的权限,在访问permission-server时先请求auth-server获取zuul 的server token,带上server token和user token去请求permission-server,在permission-server里的拦截器会对user token和server token做校验(也是启动的时候拿到那2个公钥),调用其他服务都是这个逻辑,整体大概就是这种调用
用户登录校验生成token的流程,认证服务私钥加密user token和server token
服务启动获取pub key
server token的校验通过server token拿到server信息
整体大概布局
spring cloud
jwt用户鉴权及服务鉴权
客户端请求服务时,根据提交的token获取用户信息,看是否有用户信息及用户信息是否正确
微服务中,一般有多个服务,服务与服务之间相互调用时,有的服务接口比较敏感,比如资金服务...
Spring+ Spring cloud + SSO单点登录应用认证
spring cloud sso集成的方案,也做过spring + jwt + redis的解决方案,不同系统的无缝隙集成,统一的sso单点登录界面的管理、每个应用集成的权限认证,白名单等都是我们需要...
Spring Cloud与微服务学习总结(3)——认证鉴权与API权限控制在微服务架构中的设计与实现(一)
本文转载自(http://blueskykong.com//security1/)1. 背景最近在做权限相关服务的开发,在系统微服务化后,原有的单体应用是基于session的安全权...
Spring cloud微服务实战(二)——Zuul整合Swagger2及权限校验
从年初发表了Spring cloud微服务实战——基于OAUTH2.0统一认证授权的微服务基础架构 这篇博文后就没有更新了,很多评论疑问都没来得及回复,皆因这半年来快忙成狗了。到今天终于感...
Spring Cloud Eureka 增加权限认证
上篇文章我们简单的介绍了下注册中心Eureka,文章地址:http://cxytiandi.com/blog/detail/11988Eureka自带了一个web的管理页面,方便我们查询注册到上面的实...
微服务架构中的安全认证与鉴权
从单体应用架构到分布式应用架构再到微服务架构,应用的安全访问在不断的经受考验。为了适应架构的变化、需求的变化,身份认证与鉴权方案也在不断的变革。面对数十个甚至上百个微服务之间的调用,如何保证高效安全的...
认证鉴权与API权限控制在微服务架构中的设计与实现(一)
引言: 本文系《认证鉴权与API权限控制在微服务架构中的设计与实现》系列的第一篇,本系列预计四篇文章讲解微服务下的认证鉴权与API权限控制的实现。
最近在做...
Spring Cloud中如何保证各个微服务之间调用的安全性
一.背景微服务架构下,我们的系统根据业务被拆分成了多个职责单一的微服务。每个服务都有自己的一套API提供给别的服务调用,那么如何保证安全性呢?不是说你想调用就可以调用,一定要有认证机制,是我们内部服务...
授权码类型介绍授权码类型(authorization code)通过重定向的方式让资源所有者直接与授权服务器进行交互来进行授权,避免了资源所有者信息泄漏给客户端,是功能最完整、流程最严密的授权类型,但...
没有更多推荐了,该项目未开启捐赠功能,可发送私信通知作者开启
forked from
同步操作将从 zuihou/zuihou-admin-cloud 强制同步,此操作会覆盖自 Fork 项目以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
(当前项目的 wiki 将会被覆盖!)
与超过 300 万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
已有帐号?
基于SpringCloud(Finchley.M2)
+ SpringBoot(2.0.0.M2) 的微服务 SaaS 开发平台,具有统一授权、认证后台管理系统,其中包含具备用户管理、资源权限管理、网关API、OpenAPI管理、文件服务、邮件服务、短信服务等多个模块,可以作为后端服务的开发脚手架。代码简洁,架构清晰。核心技术采用Eureka、Fegin、Ribbon、Zuul、Hystrix、JWT Token、Mybatis、SpringBoot、Redis、RabbitMQ、FastDFS等主要框架和中间件。
由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...

zuihou-admin-cloud
测试master

简介:
基于SpringCloud(Finchley.M2)
+ SpringBoot(2.0.0.M2) 的微服务 SaaS 开发平台,
具有统一授权、认证后台管理系统,其中包含具备用户管理、配置中心、存储系统、资源权限管理、
网关API、OpenAPI管理、日志分析、任务和通知等多个模块,
支持多服务并行开发,可以作为后端服务的开发脚手架。代码简洁,架构清晰,非常适合学习使用。
核心技术采用Eureka、Fegin、Ribbon、Zuul、Hystrix、JWT Token、Mybatis、SpringBoot、Redis、
RibbitMQ、FastDFS等主要框架和中间件。
希望能努力打造一套从 基础框架 - 分布式微服务架构 - 持续集成 -
自动化部署 - 系统监测 的解决方案。
该项目为本人在学习过程中通过一些其他的开源项目,资料,文章进行整合的一个提供基础功能的项目。本项目旨在实现基础能力,不设计具体业务。
目前国内的一些资料讲解和使用的SpringCloud版本都比较低,自己在基于现有的开源项目和资料学习的同时,
一边以自己的一些想法改造搭建一个相对较新版本的项目。
后期会引入Docker(慢慢学,还没到这一步)

项目地址
[github] 
[gitee] 

架构详解:

服务注册与调用:

基于Eureka来实现的服务注册与调用,在Spring Cloud中使用Feign, 我们可以做到使用HTTP请求远程服务时能与调用本地方法一样的编码体验,开发者完全感知不到这是远程方法,更感知不到这是个HTTP请求。

服务鉴权:

通过JWT的方式来加强服务之间调度的权限验证,保证内部服务的安全性。

OpenAPI鉴权:

通过JWT的方式来加强对外暴露接口调度的权限验证,保证api接口的安全性。

负载均衡:

将服务保留的rest进行代理和网关控制,除了平常经常使用的node.js、nginx外,Spring Cloud系列的zuul和rebbion,可以帮我们进行正常的网关管控和负载均衡。其中扩展和借鉴国外项目的扩展基于JWT的Zuul限流插件,方面进行限流。

熔断机制:

因为采取了服务的分布,为了避免服务之间的调用“雪崩”,采用了Hystrix的作为熔断器,避免了服务之间的“雪崩”。

监控:

利用Spring Boot Admin 来监控各个独立Service的运行状态;利用turbine来实时查看接口的运行状态和调用频率;通过Zipkin来查看各个服务之间的调用链等。

项目架构图


技术栈/版本介绍:

所涉及的相关的技术有 :

JSON序列化:Jackson
缓存:Redis 3.0.500(待升级 4.0.6)
消息队列:RibbitMQ
数据库: MySQL 5.7.9(驱动6.0.6)
定时器:Quartz Scheduler
Java模版:Thymeleaf
3.0.6.RELEASE
前端:Bootstrap + Vue2.0 (期待前端大神参与)
API网关:Zuul
服务注册与发现:Eureka
服务消费:Ribbon、OpenFeign
负载均衡:Ribbon
配置中心:Config Server
(git)
服务熔断:Hystrix
项目构建:Maven 3.3
文件服务器:FastDFS 5.0.5
服务器:centos


后期引入:

Docker
Jenkins
nginx
keepalive



本代码采用 Intellij IDEA(2018.1 EAP) 来编写,但源码与具体的 IDE 无关。

约定:

zuihou-xxx-api 项目中提供feign客户端,dto
区分po、dto,不要把po中的所有字段都返回给前端。 前端需要什么字段,就返回什么字段
类名:首字母大写驼峰规则;方法名:首字母小写驼峰规则;常量:全大写;变量:首字母小写驼峰规则,尽量非缩写
业务模块接口层命名为项目-业务-api,如zuihou-admin-api

业务模块业务层命名为项目-业务-repository,如zuihou-admin-repository

业务模块容器命名为项目-业务-server,如zuihou-admin-server

监控模块命名为项目-业务,如zuihou-admin

数据表命名为:子系统_表,如b_role

更多规范,参考[阿里巴巴Java开发手册] 



期待您的加入:
1,前端哥哥
2,后端哥哥
3,土豪哥哥(求赞助服务器)
4,小姐姐


启动指南

环境须知:

nginx (暂时没用到)
mysql ,redis ,rabbitmq
jdk1.8
IDE插件一个(Eclipse, IDEA都需要安装插件),lombok插件



项目结构:
├─zuihou-admin-cloud
│

│
├─zuihou-backend---------------------------后端服务
│
├─zuihou-admin--------------------------后端管理服务[正在开发]
│
├─zuihou-admin-api-------------------后端管理服务api接口
│
├─zuihou-admin-repository------------后端管理业务/持久层
│
├─zuihou-admin-server----------------后端管理服务
│
|─zuihou-base---------------------------基础模块服务[未开始]
│
├─zuihou-base-api--------------------基础模块接口/dto
│
├─zuihou-base-repository-------------基础模块业务/持久层
│
├─zuihou-base-server-----------------基础模块服务
│
├─zuihou-file---------------------------文件模块服务[正在开发]
│
├─zuihou-mail---------------------------邮件模块服务[未开始]
│
├─zuihou-sms----------------------------短信模块服务[未开始]
│
├─zuihou-auth---------------------------鉴权中心
│
|─zuihou-auth-api--------------------鉴权中心api[已开发]
│
|─zuihou-auth-client-----------------鉴权中心客户端[已开发]
│
|─zuihou-auth-common-----------------鉴权中心公共包[已开发]
│
|─zuihou-auth-server-----------------鉴权中心服务[已开发]
│
├─zuihou-gateway------------------------统一网关负载中心
│
|─zuihou-gateway-ratelimit-----------网关限流插件[未开始]
│
|─zuihou-gateway-server--------------项目网关服务[未开始]
│
│ 
│
├─zuihou-common----------------------------公共模块(这里一直没想好怎么调整,有想法的朋友可以给我留言)
│
├─zuihou-commons------------------------项目公共包
│
├─zuihou-core---------------------------项目核心包
│
│ 
│
├─zuihou-frontend--------------------------项目前端
│
├─zuihou-manage-center------------------管理后台
│
│
│
├─zuihou-config-repo-----------------------远程配置文件仓库
│
│
│
├─zuihou-service---------------------------服务模块
│
├─zuihou-config-------------------------配置中心[已开发]
│
├─zuihou-eureka-------------------------注册中心[已开发]
│
├─zuihou-monitor------------------------spring-boot-admin监控中心[已开发]
│
├─zuihou-zipkin-------------------------zipkin分布式链路跟踪[已开发]
│
│
│
│-...


运行步骤:
接下来分别介绍开发环境(dev)和正式环境(prod1,prod2)的运行步骤.
生产环境所有服务单例运行,生产环境所有服务运行2个实例(除了zuihou-monitor,zuihou-zipkin.这2个监控服务)

开发环境

1, 开发环境(dev)Hosts文件配置:

127.0.0.1 casserver.zuihou.com
127.0.0.1 eureka.zuihou.com
127.0.0.1 config.zuihou.com
127.0.0.1 admin.zuihou.com
127.0.0.1 base.zuihou.com
127.0.0.1 gateway.zuihou.com
127.0.0.1 auth.zuihou.com
127.0.0.1 monitor.zuihou.com
127.0.0.1 zipkin.zuihou.com zuihou-zipkin

127.0.0.1 zuihou.rabbitmq.host
127.0.0.1 zuihou.mysql.host
127.0.0.1 zuihou.redis.host



2, 依次运行数据库脚本:

doc/sql/zuihou_admin_dev.sql



3, 通过以下方法,进行密码加密:



public static void main(String[] args) throws Exception {

System.out.println(ConfigTools.encrypt("your mysql password"));

}



4, 修改配置数据库/redis/rabbitMQ配置:


(画重点)修改配置需要各位自己在github或者gitee上创建自己的仓库,但目录结构需要和zuihou-config-repo的结构一致,
然后在修改zuihou-config服务application.yml中的spring.cloud.config.server.git.uri:项。(画重点)


理论上只需根据自己的需求修改端口、帐号、密码。 ip 尽量采用虚拟域名,统一修改hosts文件。


zuihou-config-repo/zuihou-backend/zuihou-admin-server/application-dev.yml


zuihou-config-repo/zuihou-backend/zuihou-gateway-server/application-dev.yml


zuihou-config-repo/zuihou-backend/zuihou-auth-server/application-dev.yml


zuihou-config-repo/zuihou-backend/zuihou-base-server/application-dev.yml
# 待开发


zuihou-config-repo/zuihou-backend/zuihou-file-server/application-dev.yml
# 待开发


zuihou-config-repo/zuihou-backend/zuihou-mail-server/application-dev.yml
# 待开发


zuihou-config-repo/zuihou-backend/zuihou-sms-server/application-dev.yml
# 待开发


zuihou-config-repo/zuihou-service/zuihou-zipkin/application-dev.yml


zuihou-config-repo/zuihou-service/zuihou-monitor/application-dev.yml




5, 在IDE中启动:


5.1, 在IDE中启动:编译代码,修改启动参数:

以IDEA为例, Eclipse 请自行意淫 (图片看不清,请看doc/image/**)




这里只演示其中几个服务, 剩余的服务,按照相同的方法配置
最终运行实例: 




5.2,按顺序运行main类:

EurekaApplication(zuihou-eureka)
# 第一步
ConfigApplication(zuihou-config)
# 第二步
AdminServerApplication(zuihou-admin-server)
#下面的顺序无所谓
AuthApplication(zuihou-auth-server)
GatewayServerApplication(zuihou-gateway-server)
MonitorApplication(zuihou-monitor)
ZipkinApplication(zuihou-zipkin)



6, 命令行启动:

先cd 到各个服务的target目录,依次启动即可:
java -jar -Dspring.profiles.active=dev zuihou-eureka.jar
java -jar -Dspring.profiles.active=dev zuihou-config.jar
java -jar -Dspring.profiles.active=dev zuihou-***.jar




生产环境

1, 生产环境(prod1,prod2)Hosts文件配置:

127.0.0.1 casserver.zuihou.com
127.0.0.1 eureka1.zuihou.com eureka2.zuihou.com
127.0.0.1 config1.zuihou.com config2.zuihou.com

127.0.0.1 admin1.zuihou.com admin2.zuihou.com
127.0.0.1 base1.zuihou.com base2.zuihou.com
127.0.0.1 gateway1.zuihou.com gateway2.zuihou.com
127.0.0.1 auth1.zuihou.com auth2.zuihou.com
127.0.0.1 monitor.zuihou.com
127.0.0.1 zipkin.zuihou.com zuihou-zipkin

127.0.0.1 zuihou.rabbitmq.host
127.0.0.1 zuihou.mysql.host
127.0.0.1 zuihou.redis.host



2, 依次运行数据库脚本:

doc/sql/zuihou_admin_prod.sql
(数据库,redis,rabbitmq 暂时不考虑高可用)



3, 通过以下方法,进行密码加密:



public static void main(String[] args) throws Exception {

System.out.println(ConfigTools.encrypt("your mysql password"));

}



4, 修改配置数据库/redis/rabbitMQ配置:


理论上只需根据自己的需求修改端口、帐号、密码。 ip 尽量采用虚拟域名,统一修改hosts文件。


prod1 代表实例1
prod2 代表实例2 , 实例1和实例2 的启动端口根据自己的情况进行修改,但最好跟我的保持一致


zuihou-config-repo/zuihou-backend/zuihou-admin-server/application-prod*.yml


zuihou-config-repo/zuihou-backend/zuihou-gateway-server/application-prod*.yml


zuihou-config-repo/zuihou-backend/zuihou-auth-server/application-prod*.yml


zuihou-config-repo/zuihou-backend/zuihou-base-server/application-prod*.yml
# 待开发


zuihou-config-repo/zuihou-backend/zuihou-file-server/application-prod*.yml
# 待开发


zuihou-config-repo/zuihou-backend/zuihou-mail-server/application-prod*.yml
# 待开发


zuihou-config-repo/zuihou-backend/zuihou-sms-server/application-prod*.yml
# 待开发


zuihou-config-repo/zuihou-service/zuihou-zipkin/application-prod*.yml


zuihou-config-repo/zuihou-service/zuihou-monitor/application-prod*.yml




5, 在IDE中启动:


5.1, 在IDE中启动:编译代码,修改启动参数:

以IDEA为例, Eclipse 请自行意淫 (图片看不清,请看doc/image/**)



这里只演示其中几个服务, 剩余的服务,按照相同的方法配置



5.2,按顺序运行main类:

EurekaApplication(zuihou-eureka)
# 第一步
ConfigApplication(zuihou-config)
# 第二步
AdminServerApplication(zuihou-admin-server)
#下面的顺序无所谓
AuthApplication(zuihou-auth-server)
GatewayServerApplication(zuihou-gateway-server)
MonitorApplication(zuihou-monitor)
ZipkinApplication(zuihou-zipkin)



6, 命令行启动:

先cd 到各个服务的target目录,依次启动即可:
java -jar -Dspring.profiles.active=prod1 zuihou-eureka.jar
java -jar -Dspring.profiles.active=prod2 zuihou-eureka.jar
java -jar -Dspring.profiles.active=prod1 zuihou-config.jar
java -jar -Dspring.profiles.active=prod2 zuihou-config.jar
java -jar -Dspring.profiles.active=prod zuihou-monitor.jar
# 这2个是监控服务,暂时不部署多实例(别问为什么,运行太多屌丝机器吃不消)
java -jar -Dspring.profiles.active=prod zuihou-zipkin.jar
# 这2个是监控服务,暂时不部署多实例(别问为什么,运行太多屌丝机器吃不消)
java -jar -Dspring.profiles.active=prod1 zuihou-***.jar
java -jar -Dspring.profiles.active=prod2 zuihou-***.jar




端口号介绍(dev):



服务
端口号




zuihou-eureka
8500


zuihou-config
8505


zuihou-zipkin
8510


zuihou-monitor



-
-


zuihou-auth-server
9775


zuihou-gateway-server
9770


zuihou-admin-server
9765


zuihou-base-server
9760


zuihou-file-server
9755


zuihou-sms-server
9750


zuihou-email-server
9745




端口号介绍(prod):




服务
端口号1
端口号2




zuihou-eureka
8501
8502


zuihou-config
8506
8507


zuihou-zipkin
8511
8512


zuihou-monitor




-
-
-


zuihou-auth-server
9776
9777


zuihou-gateway-server
9771
9772


zuihou-admin-server
9766
9767


zuihou-base-server
9761
9762


zuihou-file-server
9756
9757


zuihou-sms-server
9751
9752


zuihou-email-server
9746
9747




项目截图:
spring-boot-admin监控界面:

spring-boot-admin监控界面:

spring-boot-admin监控界面:

spring-boot-admin监控界面:

spring-boot-admin监控界面:

zipkin监控界面:

zipkin监控界面:

API 界面:

注册中心界面:


常见报错:

1,找不到fastdfs-client-java(1.27-SNAPSHOT) jar?

答: 去附件(gitee)列表自行下载后安装到仓库即可


2, 很多依赖死活都下载不下来?

答: 由于spring-boot和spring-cloud等版本比较新,所以目前国内的一些仓库还没有新版本的jar。
需要配置spring的maven仓库。 (配置后还是无法下载,就先注释掉settings.xml中其他的仓库,只保留这个)




&mirror&

&id&spring-milestones&/id&

&name&Spring Milestones&/name&

&url&https://repo.spring.io/libs-milestone&/url&

&mirrorOf&central&/mirrorOf&

&/mirror&


3, 很多类缺少get/set方法?

答:请用IDEA或Eclipse安装lombok插件




写在最后:
本项目正在开发阶段,由于码主白天要上班,只有晚上、周末能挤点时间来敲敲代码,所以进度可能比较慢,文档、注释也不齐全。 
各位大侠就将就着看,但随着时间的推移。文档,注释,启动说明等码主我一定会补全的(对自己负责,也是对大家负责)。
正在加载...

我要回帖

更多关于 权限请求什么意思 的文章

 

随机推荐