快速搭建SpringCloud脚手架

2019-10-03  本文已影响0人  GeorgeChan_95

项目地址: https://gitee.com/GeorgeChan/spring-cloud-parent.git

项目概览 :

springcloud项目概览.png

模块分析 :

spring-cloud-parent : 父工程,管理各子模块,锁定springboot和springcloud版
本,添加maven插件。

common : 公共子模块,定义公共类和公用的jar包供其它模块使用。

eureka-server : 注册中心服务端(单节点),服务注册和发现。

producer1 : 注册中心客户端。

producer2 : 注册中心客户端,与producer1一样,为了演示Feign的负载均衡。

consumers : 注册中心客户端,使用Feign调用producer1和producer2的接口,当
发生调用异常时,通过Hystrix进行熔断和降级。

config-server : 配置中心服务端,同时作为一个eureka客户端注册到注册中心,配
置bus总线,从远程仓库读取配置文件,并进行广播分发,动态刷新配置信息。

config-client : 配置中心客户端,同时作为一个eureka客户端注册到注册中心,配
置bus总线,通过服务端实时获取刷新后的配置文件。事实上除了eureka服务端,每个模块都应当是配置中心的客户端,配置文件统一由配置中心进行管理。这里只用了这一个模块进行演示。

zuul : zuul网关,请求统一从网关进行过滤和分发。服务端限流、token鉴权都在这
里进行。

base : 这里没有作为微服务的一部分,只是springboot整合了mybatis-plus,添加了
mybatis代码生成器。只作为一个演示。

核心解读 :

搭建注册中心服务端

示例模块 : eureka-server

访问地址 :http://localhost:8761/

搭建注册中心客户端

示例模块 : producer1、producer2、consumers

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

启动项目

访问注册中心,服务实例列表中出现则注册成功。

Feign远程调用与Hystrix熔断降级

示例模块 : producer1、producer2、consumers

@Component
public class ProducerRemoteFallback implements ProducerRemote {
    @Override
    public String test1(String name) {
        return "操作异常,进行降级。。。。";
    }
}

搭建配置中心服务端

示例模块 : config-server

搭建配置中心客户端

示例模块 : config-client

/**
 * <p>
 *  @RefreshScope 使用该注解的类,会在接到SpringCloud配置中心配置刷新的时候,自动将新的配置更新到该类对应的字段中。
 *                  手动刷新配置:当配置文件发生改动的时候,需要访问接口  curl -X POST http://localhost:9001/actuator/refresh
 *                  [
 *                      "config.client.version",
 *                      "test.env"
 *                  ]
 *                  表示刷新成功!
 *                  localhost:9001 客户端ip和端口
 *
 *  如果使用bus总线刷新配置,请求:curl -X POST http://127.0.0.1:9001/actuator/bus-refresh

 *  所有配置都会刷新
 * </p>
 */
@RefreshScope
@RestController
public class ConfigClientController {

    @Value("${test.env}")
    private String hello;

    @GetMapping("/name")
    public String test() {
        return this.hello;
    }
}

搭建Zuul网关

@Component
public class MyFilter extends ZuulFilter {
    private static final Logger LOGGER = LoggerFactory.getLogger(MyFilter.class);
    /**
     * 过滤器类型,前置过滤器
     * @return
     */
    @Override
    public String filterType() {
        return PRE_TYPE;
    }

    /**
     * 过滤器顺序,越小越先执行
     * @return
     */
    @Override
    public int filterOrder() {
        return 4;
    }

    /**
     * 过滤器是否生效
     * RequestContext 请求的全局对象
     * @return boolean 是否过滤
     */
    @Override
    public boolean shouldFilter() {
        RequestContext requestContext = RequestContext.getCurrentContext();
        HttpServletRequest request = requestContext.getRequest();
        String cookie = request.getHeader("Cookie");
        String authorization = request.getHeader("Authorization");
        LOGGER.info("Cookie ====》 {}", cookie);
        LOGGER.info("Authorization ====》 {}", authorization);
        return true;
    }

    /**
     * 业务逻辑
     * 模拟token鉴权,如果Authorization为空,表示没有权限
     * @return 
     * @throws ZuulException
     */
    @Override
    public Object run() throws ZuulException {
        RequestContext requestContext = RequestContext.getCurrentContext();
        HttpServletRequest request = requestContext.getRequest();
        String cookie = request.getHeader("Cookie");
        String authorization = request.getHeader("Authorization");

        // 这里模拟权限检验,失败返回401
        if (StringUtils.isEmpty(authorization)) {
            requestContext.setSendZuulResponse(false);
            requestContext.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value());
            requestContext.setResponseBody("权限不足!");
        }
        return null;
    }
}

其它

启动顺序

当项目包含注册中心、配置中心以及网关时,启动顺序为

  1. 注册中心服务端

  2. 配置中心服务端

  3. 注册(配置)中心客户端

  4. 网关

注意 :以上代码只是示例,并不完整,详细请见 ====> 码云仓库

上一篇 下一篇

猜你喜欢

热点阅读