├── .gitignore
├── LICENSE
├── README.md
├── ad-eureka
├── pom.xml
└── src
│ └── main
│ ├── java
│ └── top
│ │ └── ezttf
│ │ └── ad
│ │ └── EurekaApplication.java
│ └── resources
│ └── application.yml
├── ad-gateway
├── pom.xml
└── src
│ └── main
│ ├── java
│ └── top
│ │ └── ezttf
│ │ └── ad
│ │ ├── ZuulGatewayApplication.java
│ │ └── filter
│ │ ├── PostRequestFilter.java
│ │ └── PreRequestFilter.java
│ └── resources
│ └── application.yml
├── ad-service
├── ad-binlog-common
│ ├── pom.xml
│ └── src
│ │ └── main
│ │ └── java
│ │ └── top
│ │ └── ezttf
│ │ └── ad
│ │ ├── constant
│ │ ├── DBConstant.java
│ │ └── OpType.java
│ │ └── dto
│ │ ├── JsonTable.java
│ │ ├── MysqlRowData.java
│ │ ├── ParseTemplate.java
│ │ ├── TableTemplate.java
│ │ └── Template.java
├── ad-binlog-kafka
│ ├── pom.xml
│ └── src
│ │ └── main
│ │ ├── java
│ │ └── top
│ │ │ └── ezttf
│ │ │ └── ad
│ │ │ ├── KafkaApplication.java
│ │ │ ├── mysql
│ │ │ ├── BinlogClient.java
│ │ │ ├── BinlogConfig.java
│ │ │ ├── TemplateHolder.java
│ │ │ ├── binlog
│ │ │ │ └── BinlogRowData.java
│ │ │ └── listener
│ │ │ │ ├── AggregationListener.java
│ │ │ │ ├── IListener.java
│ │ │ │ └── IncrementListener.java
│ │ │ ├── runner
│ │ │ └── BinlogRunner.java
│ │ │ └── sender
│ │ │ ├── ISender.java
│ │ │ └── kafka
│ │ │ └── KafkaSender.java
│ │ └── resources
│ │ ├── application.yml
│ │ └── template.json
├── ad-common
│ ├── pom.xml
│ └── src
│ │ └── main
│ │ ├── java
│ │ └── top
│ │ │ └── ezttf
│ │ │ └── ad
│ │ │ ├── advice
│ │ │ ├── CommonResponseDataAdvice.java
│ │ │ └── GlobalExceptionAdvice.java
│ │ │ ├── annotation
│ │ │ └── IgnoreResponseAdvice.java
│ │ │ ├── config
│ │ │ └── WebConfiguration.java
│ │ │ ├── dump
│ │ │ ├── DConstant.java
│ │ │ └── table
│ │ │ │ ├── AdCreativeTable.java
│ │ │ │ ├── AdCreativeUnitTable.java
│ │ │ │ ├── AdPlanTable.java
│ │ │ │ ├── AdUnitDistrictTable.java
│ │ │ │ ├── AdUnitItTable.java
│ │ │ │ ├── AdUnitKeywordTable.java
│ │ │ │ └── AdUnitTable.java
│ │ │ ├── enums
│ │ │ └── ResponseCode.java
│ │ │ ├── exception
│ │ │ ├── AdException.java
│ │ │ ├── AdPlanException.java
│ │ │ ├── AdPlanGetException.java
│ │ │ ├── AdUnitDistrictException.java
│ │ │ ├── AdUnitException.java
│ │ │ ├── AdUnitItException.java
│ │ │ ├── AdUnitKeywordException.java
│ │ │ ├── AdUserException.java
│ │ │ ├── CreativeException.java
│ │ │ └── CreativeUnitException.java
│ │ │ └── vo
│ │ │ └── CommonResponse.java
│ │ └── resources
│ │ └── application.yml
├── ad-dashboard
│ ├── pom.xml
│ └── src
│ │ └── main
│ │ ├── java
│ │ └── top
│ │ │ └── ezttf
│ │ │ └── ad
│ │ │ └── DashboardApplication.java
│ │ └── resources
│ │ └── application.yml
├── ad-dump
│ ├── pom.xml
│ └── src
│ │ ├── main
│ │ ├── java
│ │ │ └── top
│ │ │ │ └── ezttf
│ │ │ │ └── ad
│ │ │ │ ├── DumpApplication.java
│ │ │ │ ├── constant
│ │ │ │ ├── CommonStatus.java
│ │ │ │ ├── Constants.java
│ │ │ │ ├── CreativeMaterialType.java
│ │ │ │ └── CreativeType.java
│ │ │ │ ├── dao
│ │ │ │ ├── AdCreativeMapper.java
│ │ │ │ ├── AdPlanMapper.java
│ │ │ │ ├── AdUnitDistrictMapper.java
│ │ │ │ ├── AdUnitItMapper.java
│ │ │ │ ├── AdUnitKeywordMapper.java
│ │ │ │ ├── AdUnitMapper.java
│ │ │ │ ├── AdUserMapper.java
│ │ │ │ └── CreativeUnitMapper.java
│ │ │ │ ├── pojo
│ │ │ │ ├── AdCreative.java
│ │ │ │ ├── AdPlan.java
│ │ │ │ ├── AdUnit.java
│ │ │ │ ├── AdUnitDistrict.java
│ │ │ │ ├── AdUnitIt.java
│ │ │ │ ├── AdUnitKeyword.java
│ │ │ │ ├── AdUser.java
│ │ │ │ └── CreativeUnit.java
│ │ │ │ └── service
│ │ │ │ ├── IDumpService.java
│ │ │ │ └── impl
│ │ │ │ └── DumpServiceImpl.java
│ │ └── resources
│ │ │ ├── application.yml
│ │ │ ├── generatorConfig.xml
│ │ │ └── mapper
│ │ │ ├── AdCreativeMapper.xml
│ │ │ ├── AdPlanMapper.xml
│ │ │ ├── AdUnitDistrictMapper.xml
│ │ │ ├── AdUnitItMapper.xml
│ │ │ ├── AdUnitKeywordMapper.xml
│ │ │ ├── AdUnitMapper.xml
│ │ │ ├── AdUserMapper.xml
│ │ │ └── CreativeUnitMapper.xml
│ │ └── test
│ │ └── java
│ │ └── top
│ │ └── ezttf
│ │ └── ad
│ │ ├── DumpApplication.java
│ │ ├── dao
│ │ └── PageHelperTest.java
│ │ └── service
│ │ └── DumpServiceTest.java
├── ad-search
│ ├── pom.xml
│ └── src
│ │ ├── main
│ │ ├── java
│ │ │ └── top
│ │ │ │ └── ezttf
│ │ │ │ └── ad
│ │ │ │ ├── SearchApplication.java
│ │ │ │ ├── client
│ │ │ │ ├── ISponsorClient.java
│ │ │ │ ├── SponsorClientHystrix.java
│ │ │ │ └── vo
│ │ │ │ │ ├── AdPlan.java
│ │ │ │ │ └── AdPlanGetRequest.java
│ │ │ │ ├── config
│ │ │ │ ├── kafka
│ │ │ │ │ └── KafkaConfiguration.java
│ │ │ │ ├── redis
│ │ │ │ │ └── RedisConfiguration.java
│ │ │ │ └── rest
│ │ │ │ │ └── RestTemplateConfiguration.java
│ │ │ │ ├── constant
│ │ │ │ └── Constants.java
│ │ │ │ ├── consumer
│ │ │ │ └── BinlogConsumer.java
│ │ │ │ ├── controller
│ │ │ │ └── SearchController.java
│ │ │ │ ├── handler
│ │ │ │ └── AdLevelDataHandler.java
│ │ │ │ ├── index
│ │ │ │ ├── CommonStatus.java
│ │ │ │ ├── DataLevel.java
│ │ │ │ ├── DataTable.java
│ │ │ │ ├── IIndexAware.java
│ │ │ │ ├── IndexFileLoader.java
│ │ │ │ ├── adplan
│ │ │ │ │ ├── AdPlanIndex.java
│ │ │ │ │ └── AdPlanObject.java
│ │ │ │ ├── adunit
│ │ │ │ │ ├── AdUnitConstants.java
│ │ │ │ │ ├── AdUnitIndex.java
│ │ │ │ │ └── AdUnitObject.java
│ │ │ │ ├── creative
│ │ │ │ │ ├── CreativeIndex.java
│ │ │ │ │ └── CreativeObject.java
│ │ │ │ ├── creativeunit
│ │ │ │ │ ├── CreativeUnitIndex.java
│ │ │ │ │ └── CreativeUnitObject.java
│ │ │ │ ├── district
│ │ │ │ │ ├── UnitDistrictIndex.java
│ │ │ │ │ └── UnitDistrictObject.java
│ │ │ │ ├── interest
│ │ │ │ │ ├── UnitItIndex.java
│ │ │ │ │ └── UnitItObject.java
│ │ │ │ └── keyword
│ │ │ │ │ ├── UnitKeywordIndex.java
│ │ │ │ │ └── UnitKeywordObject.java
│ │ │ │ ├── kafka
│ │ │ │ ├── consumer
│ │ │ │ │ └── MyConsumer.java
│ │ │ │ ├── partitioner
│ │ │ │ │ └── CustomPartitioner.java
│ │ │ │ └── prducer
│ │ │ │ │ └── MyProducer.java
│ │ │ │ ├── search
│ │ │ │ ├── ISearch.java
│ │ │ │ ├── impl
│ │ │ │ │ └── SearchImpl.java
│ │ │ │ └── vo
│ │ │ │ │ ├── SearchRequest.java
│ │ │ │ │ ├── SearchResponse.java
│ │ │ │ │ ├── feature
│ │ │ │ │ ├── DistrictFeature.java
│ │ │ │ │ ├── FeatureRelation.java
│ │ │ │ │ ├── ItFeature.java
│ │ │ │ │ └── KeywordFeature.java
│ │ │ │ │ └── media
│ │ │ │ │ ├── AdSlot.java
│ │ │ │ │ ├── App.java
│ │ │ │ │ ├── Device.java
│ │ │ │ │ └── Geo.java
│ │ │ │ ├── sender
│ │ │ │ ├── ISender.java
│ │ │ │ └── index
│ │ │ │ │ └── IndexSender.java
│ │ │ │ └── util
│ │ │ │ ├── CommonUtils.java
│ │ │ │ └── RedisUtils.java
│ │ └── resources
│ │ │ ├── application.yml
│ │ │ ├── image
│ │ │ └── ParseTemplate_diagrams.png
│ │ │ └── template.json
│ │ └── test
│ │ └── java
│ │ └── top
│ │ └── ezttf
│ │ └── ad
│ │ ├── SearchApplication.java
│ │ ├── index
│ │ └── IndexFileLoaderTest.java
│ │ ├── redis
│ │ └── TestRedisTemplate.java
│ │ ├── service
│ │ ├── BinlogServiceTest.java
│ │ └── SearchTest.java
│ │ └── withoutspring
│ │ ├── Jdk8Test.java
│ │ ├── MapTest.java
│ │ └── StringFormatTest.java
├── ad-sponsor
│ ├── pom.xml
│ └── src
│ │ ├── main
│ │ ├── java
│ │ │ └── top
│ │ │ │ └── ezttf
│ │ │ │ └── ad
│ │ │ │ ├── SponsorApplication.java
│ │ │ │ ├── constant
│ │ │ │ ├── CommonStatus.java
│ │ │ │ ├── Constants.java
│ │ │ │ ├── CreativeMaterialType.java
│ │ │ │ └── CreativeType.java
│ │ │ │ ├── controller
│ │ │ │ ├── AdPlanController.java
│ │ │ │ ├── AdUnitController.java
│ │ │ │ ├── CreativeController.java
│ │ │ │ └── UserController.java
│ │ │ │ ├── dao
│ │ │ │ ├── AdPlanRepository.java
│ │ │ │ ├── AdUnitRepository.java
│ │ │ │ ├── AdUserRepository.java
│ │ │ │ ├── CreativeRepository.java
│ │ │ │ └── unitcondition
│ │ │ │ │ ├── AdUnitDistrictRepository.java
│ │ │ │ │ ├── AdUnitItRepository.java
│ │ │ │ │ ├── AdUnitKeywordRepository.java
│ │ │ │ │ └── CreativeUnitRepository.java
│ │ │ │ ├── pojo
│ │ │ │ ├── AdPlan.java
│ │ │ │ ├── AdUnit.java
│ │ │ │ ├── AdUser.java
│ │ │ │ ├── Creative.java
│ │ │ │ └── unitcondition
│ │ │ │ │ ├── AdUnitDistrict.java
│ │ │ │ │ ├── AdUnitIt.java
│ │ │ │ │ ├── AdUnitKeyword.java
│ │ │ │ │ └── CreativeUnit.java
│ │ │ │ ├── service
│ │ │ │ ├── IAdPlanService.java
│ │ │ │ ├── IAdUnitService.java
│ │ │ │ ├── ICreativeService.java
│ │ │ │ ├── IUserService.java
│ │ │ │ └── impl
│ │ │ │ │ ├── AdPlanServiceImpl.java
│ │ │ │ │ ├── AdUnitServiceImpl.java
│ │ │ │ │ ├── CreativeServiceImpl.java
│ │ │ │ │ └── UserServiceImpl.java
│ │ │ │ ├── util
│ │ │ │ └── CommonUtils.java
│ │ │ │ └── vo
│ │ │ │ ├── AdPlanGetRequest.java
│ │ │ │ ├── AdPlanRequest.java
│ │ │ │ ├── AdPlanResponse.java
│ │ │ │ ├── AdUnitDistrictRequest.java
│ │ │ │ ├── AdUnitDistrictResponse.java
│ │ │ │ ├── AdUnitItRequest.java
│ │ │ │ ├── AdUnitItResponse.java
│ │ │ │ ├── AdUnitKeywordRequest.java
│ │ │ │ ├── AdUnitKeywordResponse.java
│ │ │ │ ├── AdUnitRequest.java
│ │ │ │ ├── AdUnitResponse.java
│ │ │ │ ├── CreateUserRequest.java
│ │ │ │ ├── CreateUserResponse.java
│ │ │ │ ├── CreativeRequest.java
│ │ │ │ ├── CreativeResponse.java
│ │ │ │ ├── CreativeUnitRequest.java
│ │ │ │ └── CreativeUnitResponse.java
│ │ └── resources
│ │ │ ├── application.yml
│ │ │ └── logback.xml
│ │ └── test
│ │ └── java
│ │ └── top
│ │ └── ezttf
│ │ └── ad
│ │ ├── SponsorApplication.java
│ │ ├── config
│ │ └── RestTemplateConfiguration.java
│ │ ├── controller
│ │ └── UserControllerTest.java
│ │ ├── dao
│ │ └── DaoTest.java
│ │ └── service
│ │ └── AdPlanServiceTest.java
└── pom.xml
├── note
├── MySQL
│ ├── binlog.md
│ ├── index_design.md
│ └── slow_query.md
├── kafka
│ └── basic.md
├── log
│ └── elk.md
├── microservice
│ ├── Hystrix Dashboard.md
│ ├── Spring-Cloud中微服务调用.md
│ ├── feign.md
│ └── ribbon.md
├── nginx
│ ├── nginx_basic_and_module.md
│ ├── nginx_proxy.md
│ └── nginx_static_resources.md
└── thinking
│ └── thinking.md
└── pom.xml
/.gitignore:
--------------------------------------------------------------------------------
1 | # Compiled class file
2 | *.class
3 |
4 | # Log file
5 | *.log
6 |
7 | # BlueJ files
8 | *.ctxt
9 |
10 | # Mobile Tools for Java (J2ME)
11 | .mtj.tmp/
12 |
13 | # Package Files #
14 | *.war
15 | *.nar
16 | *.ear
17 | *.zip
18 | *.tar.gz
19 | *.rar
20 |
21 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
22 | hs_err_pid*
23 |
24 | .idea
25 | *.iml
26 | target/
27 |
28 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # 基于SpringCloud微服务架构, 广告系统设计与实现
2 | [慕课网实战](https://coding.imooc.com/class/310.html), 基于Spring Cloud实现的Maven多模块广告系统设计微服务。
3 |
4 | ## ad-eureka模块
5 | 使用eureka在项目中微服务的注册与发现.
6 | ## ad-gateway模块
7 | 使用zuul在项目中作为网关, 提供动态路由、监控、弹性、安全等边缘服务。
8 | ## ad-service/ad-common模块
9 | 搭建项目的全局统一配置, 包括统一响应, 统一异常。
10 | ## ad-service/ad-binlog-common模块
11 | 包含ad-binlog-kafka和ad-search模块的通用代码, 包含常量定义和向Kafka投放的消息的定义
12 | ## ad-service/ad-binlog-kafka模块
13 | 监听mysql binlog并对binlog进行解析, 将解析数据(MySQLRowData)投递到Kafka中
14 | ## ad-service/ad-dump模块
15 | 负责项目启动进行广告数据全量数据的文件导出(导出功能未对外暴露, 存在于test/java/t/e/a/service下)。
16 | ## ad-service/ad-search模块
17 | 广告检索服务, 实现广告数据的全量索引, 增量索引加载功能(监听Kafka, 获取由ad-binlog-kafka向Kafka投递的消息
18 | 反序列化后作为索引数据投递到redis), 实现媒体方检索功能。
19 | ## ad-service/ad-sponsor模块
20 | 广告投放模块, 实现广告主对于广告数据的一些增删改查的需求。
--------------------------------------------------------------------------------
/ad-eureka/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 | ad
7 | top.ezttf
8 | 1.0-SNAPSHOT
9 |
10 | 4.0.0
11 |
12 | ad-eureka
13 | eureka server
14 | ad-eureka
15 | jar
16 | 1.0-SNAPSHOT
17 |
18 |
19 | 1.8
20 | UTF-8
21 | UTF-8
22 |
23 |
24 |
25 |
26 | org.springframework.cloud
27 | spring-cloud-starter-netflix-eureka-server
28 |
29 |
30 |
31 |
32 |
33 |
34 | org.springframework.boot
35 | spring-boot-maven-plugin
36 |
37 |
38 |
39 |
40 |
41 |
--------------------------------------------------------------------------------
/ad-eureka/src/main/java/top/ezttf/ad/EurekaApplication.java:
--------------------------------------------------------------------------------
1 | package top.ezttf.ad;
2 |
3 | import org.springframework.boot.SpringApplication;
4 | import org.springframework.boot.autoconfigure.SpringBootApplication;
5 | import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
6 |
7 | /**
8 | * @author yuwen
9 | * @date 2019/1/19
10 | */
11 | @EnableEurekaServer
12 | @SpringBootApplication
13 | public class EurekaApplication {
14 |
15 | public static void main(String[] args) {
16 | SpringApplication.run(EurekaApplication.class, args);
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/ad-eureka/src/main/resources/application.yml:
--------------------------------------------------------------------------------
1 | spring:
2 | application:
3 | name: ad-eureka
4 |
5 | server:
6 | port: 8000
7 | eureka:
8 | instance:
9 | hostname: local.eureka.server
10 | client:
11 | fetch-registry: false # 是否从eureka获取注册信息, 因为是单节点不用从其他eureka server同步节点数据
12 | register-with-eureka: false # 是否将自己注册到 eureka server
13 | service-url:
14 | defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
15 |
--------------------------------------------------------------------------------
/ad-gateway/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 | ad
8 | top.ezttf
9 | 1.0-SNAPSHOT
10 |
11 | 4.0.0
12 |
13 | ad-gateway
14 | ad gateway
15 |
16 | ad-gateway
17 | jar
18 | 1.0-SNAPSHOT
19 |
20 |
21 | 1.8
22 | UTF-8
23 | UTF-8
24 |
25 |
26 |
27 |
28 | org.springframework.cloud
29 | spring-cloud-starter-netflix-eureka-client
30 |
31 |
32 | org.springframework.cloud
33 | spring-cloud-starter-netflix-zuul
34 |
35 |
36 |
37 |
38 |
39 |
40 | org.springframework.boot
41 | spring-boot-maven-plugin
42 |
43 |
44 |
45 |
--------------------------------------------------------------------------------
/ad-gateway/src/main/java/top/ezttf/ad/ZuulGatewayApplication.java:
--------------------------------------------------------------------------------
1 | package top.ezttf.ad;
2 |
3 | import org.springframework.boot.SpringApplication;
4 | import org.springframework.cloud.client.SpringCloudApplication;
5 | import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
6 |
7 | /**
8 | * @author yuwen
9 | * @date 2019/1/19
10 | */
11 | @EnableZuulProxy
12 | @SpringCloudApplication
13 | public class ZuulGatewayApplication {
14 |
15 | public static void main(String[] args) {
16 | SpringApplication.run(ZuulGatewayApplication.class, args);
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/ad-gateway/src/main/java/top/ezttf/ad/filter/PostRequestFilter.java:
--------------------------------------------------------------------------------
1 | package top.ezttf.ad.filter;
2 |
3 | import com.netflix.zuul.ZuulFilter;
4 | import com.netflix.zuul.context.RequestContext;
5 | import com.netflix.zuul.exception.ZuulException;
6 | import lombok.extern.slf4j.Slf4j;
7 | import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
8 | import org.springframework.stereotype.Component;
9 |
10 | import javax.servlet.http.HttpServletRequest;
11 | import java.time.Instant;
12 |
13 | /**
14 | * @author yuwen
15 | * @date 2019/1/19
16 | */
17 | @Slf4j
18 | @Component
19 | public class PostRequestFilter extends ZuulFilter {
20 | @Override
21 | public String filterType() {
22 | return FilterConstants.POST_TYPE;
23 | }
24 |
25 | @Override
26 | public int filterOrder() {
27 | return FilterConstants.SEND_RESPONSE_FILTER_ORDER - 1;
28 | }
29 |
30 | @Override
31 | public boolean shouldFilter() {
32 | return true;
33 | }
34 |
35 | @Override
36 | public Object run() throws ZuulException {
37 | RequestContext requestContext = RequestContext.getCurrentContext();
38 | HttpServletRequest request = requestContext.getRequest();
39 | long startTime = (long) requestContext.get("startTime");
40 | String uri = request.getRequestURI();
41 | long duration = Instant.now().toEpochMilli() - startTime;
42 |
43 | log.info("uri: " + uri + ", duration: " + duration + "ms");
44 | return null;
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/ad-gateway/src/main/java/top/ezttf/ad/filter/PreRequestFilter.java:
--------------------------------------------------------------------------------
1 | package top.ezttf.ad.filter;
2 |
3 | import com.netflix.zuul.ZuulFilter;
4 | import com.netflix.zuul.context.RequestContext;
5 | import com.netflix.zuul.exception.ZuulException;
6 | import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
7 | import org.springframework.stereotype.Component;
8 |
9 | import java.time.Instant;
10 |
11 | /**
12 | * @author yuwen
13 | * @date 2019/1/19
14 | */
15 | @Component
16 | public class PreRequestFilter extends ZuulFilter {
17 | @Override
18 | public String filterType() {
19 | return FilterConstants.PRE_TYPE;
20 | }
21 |
22 | @Override
23 | public int filterOrder() {
24 | return 0;
25 | }
26 |
27 | @Override
28 | public boolean shouldFilter() {
29 | return true;
30 | }
31 |
32 | @Override
33 | public Object run() throws ZuulException {
34 | RequestContext requestContext = RequestContext.getCurrentContext();
35 | requestContext.set("startTime", Instant.now().toEpochMilli());
36 | return null;
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/ad-gateway/src/main/resources/application.yml:
--------------------------------------------------------------------------------
1 | spring:
2 | application:
3 | name: eureka-client-ad-gateway
4 |
5 | server:
6 | port: 9000
7 |
8 | eureka:
9 | client:
10 | service-url:
11 | defaultZone: http://local.eureka.server:8000/eureka/
12 | zuul:
13 | prefix: /my-zuul
14 | routes:
15 | sponsor:
16 | # **为通配符(任意字符,支持多级目录), ?(任意单个字符), *(任意字符,支持一级目录)
17 | path: /ad-sponsor/**
18 | service-id: eureka-client-ad-sponsor
19 | # 设置不跳过前缀
20 | strip-prefix: false
21 | search:
22 | path: /ad-search/**
23 | serviceId: eureka-client-ad-search
24 | strip-prefix: false
25 | logging:
26 | level:
27 | top.ezttf.ad: debug
--------------------------------------------------------------------------------
/ad-service/ad-binlog-common/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 | ad-service
7 | top.ezttf
8 | 1.0-SNAPSHOT
9 |
10 | 4.0.0
11 | jar
12 | binlog common
13 |
14 | ad-binlog-common
15 |
16 |
17 |
18 | com.github.shyiko
19 | mysql-binlog-connector-java
20 | 0.19.0
21 |
22 |
23 | com.alibaba
24 | fastjson
25 | 1.2.58
26 |
27 |
28 |
29 |
30 |
--------------------------------------------------------------------------------
/ad-service/ad-binlog-common/src/main/java/top/ezttf/ad/constant/OpType.java:
--------------------------------------------------------------------------------
1 | package top.ezttf.ad.constant;
2 |
3 | import com.github.shyiko.mysql.binlog.event.EventType;
4 |
5 | /**
6 | * @author yuwen
7 | * @date 2019/1/29
8 | */
9 | public enum OpType {
10 |
11 | ADD,
12 | UPDATE,
13 | DELETE,
14 | OTHER;
15 |
16 | public static OpType to(EventType eventType) {
17 | if (EventType.isUpdate(eventType)) {
18 | return UPDATE;
19 | }
20 | if (EventType.isWrite(eventType)) {
21 | return ADD;
22 | }
23 | if (EventType.isDelete(eventType)) {
24 | return DELETE;
25 | }
26 | return OTHER;
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/ad-service/ad-binlog-common/src/main/java/top/ezttf/ad/dto/JsonTable.java:
--------------------------------------------------------------------------------
1 | package top.ezttf.ad.dto;
2 |
3 | import com.alibaba.fastjson.annotation.JSONField;
4 | import lombok.AllArgsConstructor;
5 | import lombok.Data;
6 | import lombok.NoArgsConstructor;
7 |
8 | import java.util.List;
9 |
10 | /**
11 | * 之所以去监听binlog去构造增量数据是因为希望检索服务与投放系统之间去解耦,
12 | * 因为投放系统在工作中, 广告主可能对以前创造的投放数据进行增删改这些操作,
13 | * 而投放系统又不希望与检索系统之间产生关联。所以我们在检索系统中主动地去监听
14 | * MySQL的binlog然后解析得到增量数据实现更新。
15 | * 由于检索服务中没有去定义各个数据库以及数据表, 所以此处定义了一份模板文件
16 | * {@literal template.json} 通过解析模板文件得到想要解析的数据库以及数据表
17 | * 因为MySQL的binlog并不关心发生变化的数据库或数据表是哪一个(所有数据库表发生变化都会记录在binlog里面)。
18 | * 所以可以在模板文件中指明想要监听的那一部分是什么
19 | *
20 | * @author yuwen
21 | * @date 2019/1/30
22 | */
23 | @Data
24 | @NoArgsConstructor
25 | @AllArgsConstructor
26 | public class JsonTable {
27 |
28 | private String tableName;
29 | private Integer level;
30 |
31 | private List insertList;
32 | private List updateList;
33 | private List deleteList;
34 |
35 | @Data
36 | @NoArgsConstructor
37 | @AllArgsConstructor
38 | public static class Column {
39 | @JSONField(name = "column")
40 | private String columnName;
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/ad-service/ad-binlog-common/src/main/java/top/ezttf/ad/dto/MysqlRowData.java:
--------------------------------------------------------------------------------
1 | package top.ezttf.ad.dto;
2 |
3 | import lombok.AllArgsConstructor;
4 | import lombok.Data;
5 | import lombok.NoArgsConstructor;
6 | import top.ezttf.ad.constant.OpType;
7 |
8 | import java.util.ArrayList;
9 | import java.util.List;
10 | import java.util.Map;
11 |
12 | /**
13 | * 投递的增量数据实体,
14 | *
15 | * @author yuwen
16 | * @date 2019/1/31
17 | */
18 | @Data
19 | @NoArgsConstructor
20 | @AllArgsConstructor
21 | public class MysqlRowData {
22 |
23 | private String tableName;
24 |
25 | private String level;
26 |
27 | private OpType opType;
28 |
29 | private List