# spring-cloud-2.x
**Repository Path**: liujunlin/spring-cloud-2.x
## Basic Information
- **Project Name**: spring-cloud-2.x
- **Description**: No description available
- **Primary Language**: Java
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2018-02-01
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# spring-cloud-2.X
本项目环境:
spring-cloud Finchley.RC1
spring boot 2.0.1.RELEASE
JDK1.8
hosts配置
#注册中心
127.0.0.1 regserver1
127.0.0.1 regserver2
127.0.0.1 regserver3
请按如下顺序搭建、启动应用:
#1.高可用注册中心
注册中心选用eureka,当然你也可以选用zookeeper。
区别可参考[https://www.cnblogs.com/jieqing/p/8394001.html](https://www.cnblogs.com/jieqing/p/8394001.html "ZooKeeper、Eureka对比")
##application.yml
sec:
user:
name: admin
#使用org.springframework.security.crypto.scrypt.SCryptPasswordEncoder加密
password: $e0801$AvWVxfGeD4EkdvK08Z8EMkYmlhVKsTZBXyC1l7SztdU8OPnEXrIbBdRsTO+wAPvQkIubRUY3wLoOdJd0+rFWog==$0LPuxlB83BE26qaODEwN7Tnhqn8GUKkgr/NYPNlQeXs=
role: USER
三个注册中心的配置application-server1.yml、application-server2.yml、application-server2.yml
##bootstrap.yml
#注册中心应用名称,三个节点必须统一
spring:
application:
name: eureka-server
#2.配置中心
用于统一配置文件,尽量避免去各个应用进行分散配置。方便管理。
##application.yml
server:
port: 3001
spring:
profiles:
#使用本地目录
active: native
application:
#注册中心应用名称
name: XDH-CONFIG-SERVER
cloud:
config:
server:
native:
#配置文件的存放地址,这里用的本地目录,也可以配置成从git、svn读取
search-locations: file:///E:/Project/spring-cloud-2.x/config-repo
eureka:
instance:
prefer-ip-address: true
client:
service-url:
#将注册中心注册到注册中心,这样可以启动多个配置中心提供高可用服务
defaultZone: http://admin:ABCabc123@regserver1:8001/eureka/,http://admin:ABCabc123@regserver2:8002/eureka/,http://admin:ABCabc123@regserver3:8003/eureka/
##bootstrap.yml
#为了安全性,可以使用证书加密配置内容,对于安全性要求较高的配置,可以进行加密存放。jks证书使用keytool生成
encrypt:
key-store:
location: classpath:/xdh-cloud-key.jks
alias: xdh-cloud-key
password: ABCabc123
#3.安全签名颁发服务 jwt-security-provider
用于提供jwt token的生成服务,前端应用登陆成功获取该token后则可以调用各个服务。为了安全,采用https连接,为了方便,采用配置中心相同的证书。
####### 由于自签证书默认是不被浏览器信任,因此第一次访问https链接时会询问是否信任,所以需要用页面去访问登陆接口,并继续完成https请求,后续才可以用ajax去调用https验证接口
##bootstrap.yml
spring:
application:
name: jwtsecurity-provider
cloud:
config:
profile: ${spring.profiles.active}
name: ${spring.application.name}
#从注册中心获取配置中心的配置
discovery:
enabled: true
service-id: XDH-CONFIG-SERVER
eureka:
client:
service-url:
defaultZone: http://admin:ABCabc123@regserver1:8001/eureka,http://admin:ABCabc123@regserver2:8002/eureka,http://admin:ABCabc123@regserver3:8003/eureka
##application.yml
server:
port: ${jwtsecurity.provider.port}
#如果使用https,则配置此项
ssl:
key-store: cloud-config/src/main/resources/xdh-cloud-key.jks
key-store-password: ABCabc123
key-store-type: JKS
keyAlias: xdh-cloud-key
##jwtsecurity-provider-dev.yml
security:
jwt:
#签名有效期
tokenExpirationSeconds: 600
#下次刷新时间,供前端获取后,设置一个刷新token的延迟时间
tokenNextRefreshSeconds: 500
#4.安全签名检验过滤模块 jwt-security-client-filter
该模块需要集成到需要安全检验的消费者中。
用于提供jwt token的检验服务,若token无效或失效,直接返回失败json消息,不再调用后端服务。
#5.producer-*-api
生产者与消费者共同的API,消费者根据API调用相应的服务。
#6.生产者producer
提供rest服务,实现了相应的API接口。服务会注册到注册中心供调用。
#7.消费者consumer
一般而言,消费者定义会为与前端交互的应用,可能会调用部分服务提供者。
#8.日志收集zipkin
用于展示各服务之间的调用情况,包括各环节调用时长、依赖链分析,方便捕捉异常的应用。
###部署步骤
###8.1 部署zipkin server
[https://search.maven.org/remote_content?g=io.zipkin.java&a=zipkin-server&v=LATEST&c=exec](https://search.maven.org/remote_content?g=io.zipkin.java&a=zipkin-server&v=LATEST&c=exec "下载最新版本")
下载zipkin-server-*-exec.jar,直接java -jar启动,默认访问地址http://localhost:9411/
###8.2 集成zipkin客户端(HTTP)
在需要zipkin进行分析应用中,引入
org.springframework.cloud
spring-cloud-starter-zipkin
配置文件中
spring:
zipkin:
base-url: http://localhost:9411
为了简化,只需在API模块中引入spring-cloud-starter-zipkin,在配置中心application.xml引入地址base-url配置
###8.3 集成zipkin客户端(MQ)
基于HTTP方式的日志采集会有性能损耗,通常会使用MQ来作为日志采集通道,性能较好。
org.springframework.cloud
spring-cloud-starter-zipkin
org.springframework.amqp
spring-rabbit
然后配置MQ地址:
spring:
rabbitmq:
host: localhost
port: 5672
username: admin
password: ABCabc123
注意:部分资料说的是引入spring-cloud-sleuth-stream依赖,实际该依赖在新版本中已被标志为过时。
#9.前端开发基础库及规范 web-static
使用require
引用authService用于权限检验。在页面页面跳转前调用doAuth,如权限检查不通过,则跳转到登陆页面。
##nginx.conf配置
server {
listen 9991;
location / {
autoindex on;
autoindex_exact_size on;
autoindex_localtime on;
root E:/Project/spring-cloud-2.x/web-static;
}
}
## config/authConfig.js
define(function () {
return {
//登陆页面地址
LOGIN_PAGE_URL:"http://localhost:9991/test/auth/login.html",
//登陆接口地址
JWT_LOGIN_URL:"https://localhost:8888/auth/login",
//刷新token接口地址
REFRESH_TOKEN_URL:"https://localhost:8888/auth/refreshToken"
};
});
#10.Spring Cloud Gateway 服务网关
基于Spring的微服务结点在能力上没有高低贵贱之分,但是在角色上会分为边缘服务和内部服务两部分。内部服务顾名思义是为对内暴露服务的结点,供架构内部来调用;边缘服务是对外部网络暴露的服务结点,也就是对外API接口。
###10.1 网关路由配置
zuul:
routes:
demo-feign-freeservice:
path: /api-service/**
user-service:
path: /api-consumer/**
serviceId: demo-feign-freeconsumer
163:
path: /163
url: http://www.163.com/
这里对路由的配置用了3种格式,体现了API Gateway的路由分发功能:
第一种格式(path-url):如果请求/163这个地址,将会转发到http://www.163.com上去
第二种(path-serviceId):如果请求/api-consumer开头的地址,将会转发到eureka上serviceId为“demo-feign-freeconsumer”这个服务上去。
第三种(给微服务名指定path):给demo-feign-freeservice这个微服务指定了它的请求地址是/api-service/**
(其实这里还隐藏了第四种:什么都不配,默认给注册到eureka上的所有服务以第三种方式进行路由,path就是微服务自己的名字,但是此种方式又是不安全的,相当于将非边缘服务也暴露给外网,一般需要关闭这个默认配置zuul.ignored-services=*,或者至少将受保护的微服务列表维护到zuul.ignored-services中)
###10.2 路由匹配规则:
/user-service/? 很少用,支持/user-service/后拼接任意一个字符,例如/user-service/a、/user-service/1,不支持/user-service/123
/user-service/* 较少用,支持/user-service/后拼接任意一个字符例如/user-service/abc、/user-service/1,不支持多级目录/user-service/abc/b
/user-service/** 通用,只要以/user-service/开头就可以,后面路径没要求。
如果路由规则有交集的部分,只能使用YAML文件来做application的配置文件,不能使用properties,因为YAML是有序的(流解析),properties无序的(HashMap)。
例如:
zuul:
routes:
user-service-ext:
path: /user-service/ext/**
serviceId: user-service-ext
user-service:
path: /user-service/**
serviceId: user-service
###10.3 网关过滤器
public class AccessFilter extends ZuulFilter{
@Override
public Object run() {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
Object accessToken = request.getParameter("accessToken");
if(accessToken==null) {
ctx.setSendZuulResponse(false);
ctx.setResponseStatusCode(401);
//为了被error过滤器捕获
ctx.set("error.status_code", HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
ctx.set("error.exception",new RuntimeException("AccessToken is null"));
return null;
}
return null;
}
@Override
public boolean shouldFilter() {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
if(request.getRequestURI().equals("/163")) {
return false;
}else {
return true;
}
}
@Override
public int filterOrder() {
return 0;
}
@Override
public String filterType() {
return "pre";
}
}
继承抽象类zuulFilter,有4个方法需要实现:
filterType:过滤器类型,决定了过滤器在哪个周期生效。类型有pre、route、post、error,对应Spring AOP里的前加强、前后加强、后加强、异常处理。
filterOrder:过滤器的执行顺序,多个过滤器同时存在时根据这个order来决定先后顺序,越小优先级越高
shouldFilter:过滤器是否被执行,只有true时才会执行run()里的代码。我们这里除开访问163会放行其他情况都需要进行过滤判断,在生产环境一般是要根据函数条件来判断的。
run:过滤逻辑。
整个代码的zuul的代码逻辑很简单,对外统一的访问路径是zuul服务的地址,如果直接访问163过滤器不生效直接放行,访问其它内部服务结点需要判断是否有accessToken。
#10.spring-cloud-bus 消息总线
用于监听配置的更新。
步骤一:
需要动态更新的应用,加入依赖
org.springframework.cloud
spring-cloud-starter-bus-amqp
步骤二:
在需要更新配置的类上加@RefreshScope注解
步骤三:为了方便管理,在配置中心上开启刷新功能(Spring Boot 2不再默认开放节点,需要自行配置)
management:
endpoints:
web:
exposure:
include: "bus-refresh"
刷新操作:http://localhost:3001/actuator/bus-refresh
#11.ELK日志存储
#12.Hystrix 断路器
引入
org.springframework.cloud
spring-cloud-starter-netflix-hystrix
在需要断路器的方法上,增加注解
@HystrixCommand(fallbackMethod = "addServiceFallback")
public Object queryPostgresql(String sql) {
return postgresqlService.queryForList(sql);
}
public String addServiceFallback(String sql) {
return "sql could not excute";
}
注意:addServiceFallback 方法的参数必须与queryPostgresql上的相同,网上一些资料可能没提到。否则,可能会出现异常:
com.netflix.hystrix.contrib.javanica.exception.FallbackDefinitionException:
fallback method wasn't found: defaultUser([class java.lang.Long])
#Spring Cloud 学习参考
[http://blog.didispace.com](http://blog.didispace.com "程序猿DD")
[https://github.com/yinjihuan/spring-cloud](https://github.com/yinjihuan/spring-cloud "微服务研究案列")
[https://www.cnblogs.com/shunyang](https://www.cnblogs.com/shunyang "静静的码农")
[https://my.oschina.net/ityouknow/blog/1923560](https://my.oschina.net/ityouknow/blog/1923560 "Spring Cloud 开源软件都有哪些")