SpringCloud服务治理(一)网关统一服务提供者

总体设计架构图

测试示例

一、环境准备

1,下载nacos包并命令运行

nacos默认账号密码:nacos/nacos

服务列表如下

2,下载redis包并运行

3,mysql docker运行

4,git源码下载

github.com/aliyun/alib…

项目地址:github.com/aliyun/alib…

注:选择springcloud-dubbo测试目的是解决重构现实场景下老旧项目的重构,低门坎快速接入http<->rpc相互转换这一过程,以及springcloud强大的生态环境。

环境整理完毕

项目采用zuul网关方式统一接入所有服务,http访问,rest服务加dubbo协议处理用户请求。

修改配置

服务运行情况

项目运行成功之后效果

二、技术点说明

1, zuul路由配置

商品服务查询商品信息接口路由转发

zuul.routes.api-a.id=api-a
zuul.routes.api-a.path=/api/a/**
zuul.routes.api-a.service-id=productservice
复制代码

可以通过如下方式把所有服务代理到localhost:8080/xx/xx下,对外提供一个服务者

zuul.routes.api-b.id=api-b
zuul.routes.api-b.path=/**
zuul.routes.api-b.service-id=productservice
复制代码

2,http协议到rpc协议,代码层面怎么实现的?

cartservice-api-购物车API接口

cartservice-provider-购物车服务提供者

cartservice-consumer-购物车服务消费者

注:项目中只创建API接口与provider服务,consumer服务为聚合服务或者其他基础服务,通过@Reference注解导入API接口,项目启动时会向注册中心注册消费者服务。

例:

import org.apache.dubbo.config.annotation.Reference;@Reference(version = "1.0.0", check = false)
private CartService cartService;
复制代码

需要引入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-dependencies</artifactId>
    <version>${spring.boot.version}</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-openfeign-dependencies</artifactId>
    <version>${spring-cloud-openfeign.version}</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-dependencies</artifactId>
    <version>${spring.cloud.alibaba.version}</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>
<dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo-dependencies-bom</artifactId>
    <version>${dubbo.version}</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>
<dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo-spring-boot-starter</artifactId>
    <version>${dubbo.spring.version}</version>
</dependency>

<dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo</artifactId>
    <version>${dubbo.version}</version>
    <exclusions>
        <exclusion>
            <groupId>org.springframework</groupId>
            <artifactId>spring</artifactId>
        </exclusion>
        <exclusion>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
        </exclusion>
        <exclusion>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
    <groupId>com.spring4all</groupId>
    <artifactId>swagger-spring-boot-starter</artifactId>
    <version>1.7.0.RELEASE</version>
</dependency>
复制代码

API接口

服务提供者实现API接口

服务消费者使用API接口,可以在restController层直接,创建服务消费者,与下图创建一致

dubbo配置

springcloud配置

3,swagger API文档聚合

<dependency>
    <groupId>com.spring4all</groupId>
    <artifactId>swagger-spring-boot-starter</artifactId>
    <version>1.7.0.RELEASE</version>
</dependency>

@EnableSwagger2Doc
public class Application {

swagger.enabled=true
swagger.base-package= com.alibabacloud.hipstershop
swagger.base-path=/**
复制代码

4,zuul过滤器拓展

4.1,PreRequestLogFilter拓展,用于请求创建之间过滤

public class PreRequestLogFilter extends ZuulFilter {
    @Override
    public String filterType() { return FilterConstants.PRE_TYPE; }
    @Override
    public int filterOrder() { return 0; }
    @Override
    public boolean shouldFilter() { return true; }
    @Override
    public Object run() {
        RequestContext currentContext = RequestContext.getCurrentContext();
        HttpServletRequest request = currentContext.getRequest();
        System.out.print(String.format("send %s request to %s",request.getMethod(),request.getRequestURL()));
        return null;
    }
}
复制代码

springapplication 添加如下内容

@Bean
public PreRequestLogFilter preRequestLogFilter(){
    return new PreRequestLogFilter();
}
复制代码

自定义过滤器使用

zuul.PreRequestLogFilter.pre.disable= true
复制代码

过滤器说明

注:

  • filterType:该函数需要返回一个字符串来代表过滤器的类型,而这个类型就是在HTTP请求过程中定义的各个阶段。在Zuul中默认定义了4种不同生命周期的过滤器类型,具体如下所示。
  • pre:可以在请求被路由之前调用。 
  • routing:在路由请求时被调用。 
  • post:在routing和error过滤器之后被调用。
  •  error: 处理请求时发生错误时被调用。 
  • filterOrder:通过int值来定义过滤器的执行顺序,数值越小优先级越高。
  • shouldFilter: 返回一个boolean值来判断该过滤器是否要执行。我们可以通过此方法来指定过滤器的有效范围。
  •  run:过滤器的具体逻辑。在该函数中,我们可以实现自定义的过滤逻辑,来确定 是否要拦截当前的请求,不对其进行后续的路由,或是在请求路由返回结果之后,对处理结果做一些加工等。
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享