项目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--------------------------------------------------------------

发布了308 篇原创文章 · 获赞 11 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_28764557/article/details/104275133