欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

项目2---十次方项目开发---后台--springcloud之一统天下---08

程序员文章站 2022-04-29 20:59:54
...

反馈:为什么用

SpringCloud原理:被springboot封装。

项目2---十次方项目开发---后台--springcloud之一统天下---08

转换的执行的速度更快的。

项目2---十次方项目开发---后台--springcloud之一统天下---08

socket---------------->http

----------------------------------------------------------------01------------------------------------------------------------

Hystrix:

项目2---十次方项目开发---后台--springcloud之一统天下---08

微服务之间的调用都是同步的。

Hystrix解决分布式事务:http://codin.im/2017/06/02/rest-micro-services-distributed-trasaction-3-fallback/

出现异常取另外一个分支。

Feign里面是有熔断器的。

快速体验:

第一步:我们在问答调用了base。

我们在postman里面测试下调用的问题:

localhost:9003/problem/label/1

项目2---十次方项目开发---后台--springcloud之一统天下---08

第二步:关闭base微服务

项目2---十次方项目开发---后台--springcloud之一统天下---08

第三步:

项目2---十次方项目开发---后台--springcloud之一统天下---08

第四步:

项目2---十次方项目开发---后台--springcloud之一统天下---08

第五步:打开熔断器

项目2---十次方项目开发---后台--springcloud之一统天下---08

 

第六步:测试

项目2---十次方项目开发---后台--springcloud之一统天下---08

第七步:打开base

项目2---十次方项目开发---后台--springcloud之一统天下---08

我自己的总结:Hystrix只有在事务里面才会会滚吧。

----------------------------------------------------------------02------------------------------------------------------------

网关:

为什么用?

项目2---十次方项目开发---后台--springcloud之一统天下---08

----------------------------------------------------------------03------------------------------------------------------------

前台网关的搭建:

搭建后台的网关:

第一步:建网关模块

项目2---十次方项目开发---后台--springcloud之一统天下---08

第二步:导入依赖

<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

第五步:写启动类

项目2---十次方项目开发---后台--springcloud之一统天下---08

注意这个注解是可以省略的。注意网关的enable是不能省略的。

@SpringBootApplication
@EnableEurekaClient
@EnableZuulProxy
public class ManagerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ManagerApplication.class);
    }
}

第六步:测试,跑base,查询

项目2---十次方项目开发---后台--springcloud之一统天下---08

项目2---十次方项目开发---后台--springcloud之一统天下---08

--------------------------------------------------------------04--------------------------------------------------------------

前台的网关的搭建:

第一步:搭建模块

项目2---十次方项目开发---后台--springcloud之一统天下---08

第二步:pom引入依赖

第三步:修改yml

第四步:启动类

@SpringBootApplication
@EnableEurekaClient
@EnableZuulProxy
public class WebApplication {
    public static void main(String[] args) {
        SpringApplication.run(WebApplication.class);
    }
}

第五步:测试访问

项目2---十次方项目开发---后台--springcloud之一统天下---08

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

测试:

第一步:

项目2---十次方项目开发---后台--springcloud之一统天下---08

第二步:

项目2---十次方项目开发---后台--springcloud之一统天下---08

项目2---十次方项目开发---后台--springcloud之一统天下---08

发现头信息丢失。

第三步:

项目2---十次方项目开发---后台--springcloud之一统天下---08

前台转发,后台验证转发。

--------------------------------------------------------------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;
    }
}

测试:

项目2---十次方项目开发---后台--springcloud之一统天下---08

--------------------------------------------------------------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再访问接口即可。

---

插播一个技巧,如何找类型:

项目2---十次方项目开发---后台--springcloud之一统天下---08

去这里找:

项目2---十次方项目开发---后台--springcloud之一统天下---08

 

--------------------------------------------------------------09--------------------------------------------------------------