总体设计架构图
测试示例
一、环境准备
1,下载nacos包并命令运行
nacos默认账号密码:nacos/nacos
服务列表如下
2,下载redis包并运行
3,mysql docker运行
4,git源码下载
注:选择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:过滤器的具体逻辑。在该函数中,我们可以实现自定义的过滤逻辑,来确定 是否要拦截当前的请求,不对其进行后续的路由,或是在请求路由返回结果之后,对处理结果做一些加工等。