项目2---十次方项目开发---后台--springcloud之一统天下---08
反馈:为什么用
SpringCloud原理:被springboot封装。
转换的执行的速度更快的。
socket---------------->http
----------------------------------------------------------------01------------------------------------------------------------
Hystrix:
微服务之间的调用都是同步的。
Hystrix解决分布式事务:http://codin.im/2017/06/02/rest-micro-services-distributed-trasaction-3-fallback/
出现异常取另外一个分支。
Feign里面是有熔断器的。
快速体验:
第一步:我们在问答调用了base。
我们在postman里面测试下调用的问题:
localhost:9003/problem/label/1
第二步:关闭base微服务
第三步:
第四步:
第五步:打开熔断器
第六步:测试
第七步:打开base
我自己的总结:Hystrix只有在事务里面才会会滚吧。
----------------------------------------------------------------02------------------------------------------------------------
网关:
为什么用?
----------------------------------------------------------------03------------------------------------------------------------
前台网关的搭建:
搭建后台的网关:
第一步:建网关模块
第二步:导入依赖
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
<dependency>
<groupId>com.tensquare</groupId>
<artifactId>tensquare_common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
第三步:yml文件的编写,写eureka的配置
server:
port: 9011
spring:
application:
name: tensquare_manager
eureka:
client:
service-url:
defaultZone: http://localhost:6868/eureka/
instance:
prefer-ip-address: true
第四步:在yml里面配置网关
zuul:
routes:
tensquare-base:
path: /base/**
serviceId: tensquare-base
第五步:写启动类
注意这个注解是可以省略的。注意网关的enable是不能省略的。
@SpringBootApplication
@EnableEurekaClient
@EnableZuulProxy
public class ManagerApplication {
public static void main(String[] args) {
SpringApplication.run(ManagerApplication.class);
}
}
第六步:测试,跑base,查询
--------------------------------------------------------------04--------------------------------------------------------------
前台的网关的搭建:
第一步:搭建模块
第二步:pom引入依赖
第三步:修改yml
第四步:启动类
@SpringBootApplication
@EnableEurekaClient
@EnableZuulProxy
public class WebApplication {
public static void main(String[] args) {
SpringApplication.run(WebApplication.class);
}
}
第五步:测试访问
--------------------------------------------------------------05--------------------------------------------------------------
网关过滤器介绍:
基于网关的统一入口,我们可以把登陆鉴权写在这里。
第一步:我们在后台的网关写一个过滤器,抛到容器,让其可以被扫描到。
package com.tensquare.filter;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.exception.ZuulException;
import org.springframework.stereotype.Component;
@Component
public class ManagerFilter extends ZuulFilter {
@Override
public String filterType() {
return "pre";
}
/**
* 多个过滤器的执行顺序
* @return
*/
@Override
public int filterOrder() {
// 0是优先执行我这个过滤器
return 0;
}
/**
* 当前过滤器是不是开启
* @return
*/
@Override
public boolean shouldFilter() {
return true;
}
/**
*
* @return 过滤器执行的操作
* @throws ZuulException
* null也是继续执行 其他任何对象是继续执行
* setsendzuulResponse(false)是不再继续执行
*/
@Override
public Object run() throws ZuulException {
System.out.println("后台经过了过滤器");
return null;
}
}
--------------------------------------------------------------06--------------------------------------------------------------
测试:
第一步:
第二步:
发现头信息丢失。
第三步:
前台转发,后台验证转发。
--------------------------------------------------------------07--------------------------------------------------------------
@Override
public Object run() throws ZuulException {
//得到request上下文 用zuul的比较好
RequestContext context = RequestContext.getCurrentContext();
HttpServletRequest request = context.getRequest();
//得到header
String header = request.getHeader("Authorization");
//判断是否有头信息
if(header!=null &&!"".equals(header)){
//把头信息继续向下传,因为经过网关头信息会丢失
context.addZuulRequestHeader("Authorization",header);
}
return null;
}
}
测试:
--------------------------------------------------------------08--------------------------------------------------------------
网关做后台的验证:
第一步:用到JWT验证导入common包。
<dependency>
<artifactId>tensquare_common</artifactId>
<groupId>com.tensquare</groupId>
<version>1.0-SNAPSHOT</version>
</dependency>
写yml:
jwt:
config:
key: itcast
第二步:
@SpringBootApplication
@EnableEurekaClient
@EnableZuulProxy
public class ManagerApplication {
public static void main(String[] args) {
SpringApplication.run(ManagerApplication.class);
}
@Bean
public JwtUtil jwtUtil(){
return new JwtUtil();
}
}
第三步:写zuul的过滤器
网关的转发:第一次找对应的路径主要是负责分发的请求,第二次请求式找我们的服务。
@Override
public Object run() throws ZuulException {
RequestContext context = RequestContext.getCurrentContext();
HttpServletRequest request = context.getRequest();
if(request.getMethod().equals("OPTIONS")){
return null;
}
// 登陆要放行
if(request.getRequestURL().indexOf("login")>0){
return null;
}
//得到header
String header = request.getHeader("Authorization");
//判断是否有头信息
if(header!=null &&!"".equals(header)){
//把头信息继续向下传,因为经过网关头信息会丢失
// context.addZuulRequestHeader("Authorization",header);
//如果包含有Authorization头信息,就进行解析
if(header.startsWith("Bearer")){
String token=header.substring(7);
try {
Claims claims = jwtUtil.parseJWT(token);
String roles=(String)claims.get("roles");
if(roles!=null&&"admin".equals(roles)){
context.addZuulRequestHeader("Authorization",header);
return null;
}
}catch (Exception e){
context.setSendZuulResponse(false);
}
}
}
context.setSendZuulResponse(false);
// 权限不足
context.setResponseStatusCode(403);
context.setResponseBody("权限不足");
//写了汉字就要设置编码 JSON式application-json
context.getResponse().setContentType("text/html;charset=utf-8");
return null;
}
第四步:测试
先登陆获取token再访问接口即可。
---
插播一个技巧,如何找类型:
去这里找:
--------------------------------------------------------------09--------------------------------------------------------------