基于 SpringCloud 微服务架构的广告系统(第一部分:eureka、zuul、通用模块)
- 2019 年 11 月 12 日
- 筆記
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43126117/article/details/102911115
目录
广告系统架构图
一、eureka服务
二、zuul网关
zuul启动与自定义过滤器(实现访问记录)示意图
三、通用模块(统一响应与统一异常)
统一响应(对象)示意图
统一响应示意图
统一异常(对象)示意图
通用索引表
这不是一个完整的广告系统,主要涉及两方面 广告检索 、广告投放 ,这两个方面我感觉是最重要的,但是也使用Kafka的消息传递,为剩下的曝光见监测、 报表 、扣费 这三个部分留下了接口。
这一章,是为广告检索 、广告投放提前做的准备,主要实现eureka 服务注册与发现模块、统一响应模块 、zuul网关模块、系统监控模块。(不讲代码实现,下载代码自己看。)
spring cloud 架构图

spring cloud 架构实现计划—总体技术分层

当前项目所用到技术栈
JDK 、Kafka 、MySQL
框架 SpringCloud: Finchley.RELEASE 、Spring 、Spring Data JPA 、Spring boot
源码 : github https://github.com/yingyingqiqi/luoweiying-ad-spring-cloud/tree/master
一、eureka服务

一个单节点的eureka服务,为整个微服务提供服务注册与发现,尽量不要用单节点的,稳定性不够高,要是这个节点崩了,整个微服务就用不了,建议使用多节点。
maven坐标
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency>
配置文件
spring: application: name: ad-eureka server: port: 8000 eureka: instance: hostname: localhost client: # 是否获取注册信息,单节点 是否向eureka注册 fetch-registry: false register-with-eureka: false service-url: defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
启动类
@EnableEurekaServer //启动eureka服务 @SpringBootApplication //springboot引导 public class EurekaApplication { public static void main(String[] args) { SpringApplication.run(EurekaApplication.class, args); } }
二、zuul网关

网关介绍:微服务系统中往往包含很多个功能不同的子系统或微服务,外部应用怎样去访问各种各样的微服务呢?这也是zuul所需要解决的主要问题。在微服务架构中, 后端服务往往不直接开放给调用端, 而是通过一个服务网关 根据请求的 url, 路由到相应的服务, 即实现请求转发。
微服务的网关功能,与我们所使用的路由器、硬件网关…等是有类是功能的,做路由转发、均衡负载、反向代理、动态路由等等。
在此项目中,我们使用路由转发 和 ZuulFilter自定义过滤器(实现访问记录)。
补充:Zuul是奈菲提供的,ZuulFilter这个类没有使用servlet.Filter。
maven坐标
<!-- Eureka 客户端, 客户端向 Eureka Server 注册的时候会提供一系列的元数据信息, 例如: 主机, 端口, 健康检查url等 Eureka Server 接受每个客户端发送的心跳信息, 如果在某个配置的超时时间内未接收到心跳信息, 实例会被从注册列表中移除 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <!-- 服务网关 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId> </dependency>
配置文件
spring: application: name: ad-gateway server: port: 9000 #向eureka注册 eureka: client: service-url: defaultZone: http://localhost:8000/eureka/ #网关配置 zuul: prefix: /ad routes: ad-sponsor: path: /ad-sponsor/** serviceId: eureka-client-ad-sponsor strip-prifix: true # 转发的时候保留前缀 如 ip:8000/ad/ad-sponsor/craete/adPlan 转发:/ad-sponsro/create/adPlan ad-search: path: /ad-search/** serviceId: eureka-client-ad-search strip-prifix: true
zuul启动与自定义过滤器(实现访问记录)示意图

自定义过滤器(实现访问记录),继承ZuulFilter类:
- 1.实现过滤器 路由前后顺序、
- 2.此过滤器选择路由后的执行顺序 、
- 3.此过滤器是否执行、
- 4.要执行的方法 这里用到(RequestContext.getCurrentContext),保存访问开始信息。
三、通用模块(统一响应与统一异常)
为什么要做这个模块,响应与异常处理,每个微服务大都需要的,要是每个服务都使用一份独特的,这样特别不利于维护。
- 通用的代码,配置不应该散落在各个微服务模块,不利于维护。
- 统一的响应,一个大的系统,响应对象需要一层统一的封装。
- 统一的异常处理,不直接展示错误,对用户友好 ; 异常分类,便于排查问题,debug ; 降低业务代码中对异常处理的耦合。
统一响应(对象)示意图

统一响应示意图

统一异常(对象)示意图

统一的响应与统一异常处理总结:
- 1.用了Spring MVC ControllerAdvice的拦截器 ResponseBodyAdvice接口、 @ExceptionHandler注解。
- 2.实现Webconfigurer接口的configureMessageconverters方法,清空所有转换器,只添加MappingJackson2HttpMessageConverter转换器
- 3.详细的介绍 点击 Spring MVC ControllerAdvice深入解析
通用索引表

这些索引表,是为了各个服务调用时,作为传递对象使用,使用频率很高,所有也放在通用模块。
上面三个部分是这个广告投放项目的准备工作,后面的部分比较难,我通过两章来进一部介绍。