一、广告系统业务需求
广告投放数据的核心要素
-
用户账户 -> 最高层级,用于定义广告主或代理商,只有有了用户才会有接下来的数据投放
-
推广计划 -> 一类品牌或产品广告投放的规划,自身并不定义太多关于广告自身的信息,它会将信息打包下放到推广单元层级
-
推广单元 -> 一个确定的广告投放策略,描述了投放广告的规则信息
-
推广单元维度限制 -> 广告投放会有一些限制条件,例如只投放到北京、上海地区,对一些关键字进行投放等等 (这可能是比较难理解的概念,需要大家好好的思考)
-
广告创意 -> 展示给用户看到的数据,可以是图片、文本或者一段视频
二、业务系统开发注意
1.@SpringBootApplication 与@SpringCloudApplication
@SpringBootApplication 、@SpringCloudApplication,这两个注解不是一个功能,他们都是组合注解,但是,你可以看到它们名字的区别。一个是 Boot,一个是 Cloud。
注解 @SpringCloudApplication 包括:@SpringBootApplication、@EnableDiscoveryClient、@EnableCircuitBreaker,分别是 SpringBoot 注解、注册服务中心 Eureka 注解、断路器注解。对于SpringCloud 来说,这是每一微服务必须应有的三个注解,所以才推出了 @SpringCloudApplication 这一注解集合。
所以,当你的工程只是一个 SpringBoot 工程,那么,只需要加上 @SpringBootApplication 注解就可以了;如果你的工程需要服务发现,那么,无疑,需要添加 @SpringCloudApplication 注解。
2.主类上的注解:
@EnableFeignClients:让当前的工程开启 Feign 的功能;
@EnableCircuitBreaker:让当前的工程允许熔断;
@EnableEurekaClient:让当前的工程作为 Eureka Client(相对于 Eureka Server 而言)
3.MyBatis 与 Spring Data Jpa 对比:
1. MyBatis 的优势在于 SQL 的自由度上,SQL优化和返回对象的大小都是可控的;
2. Spring Data Jpa 在开发效率上会更高,不需要编写大量的 SQL
其实,在实际的企业级开发中,MyBatis 和 Spring Data Jpa 的选择上并没有太多考虑,可能是项目自身的约束,也可能是个人的开发习惯。对于当前的项目来说,完全可以将 Jpa 的方式自行替换成 MyBatis。
JPA 我们在使用的时候编写的是接口,在实现上,JPA 会通过动态代理给我们生成对应的查询类,所以,比你直接使用 SQL 型的查询肯定要效率低一些。不过,这大大方便了我们的编码过程,性能方面,除非你有很高并发的需求,否则,忽略不计。
4.业务系统在网关中的配置
业务系统application.yml
server:
port: 7000
servlet:
context-path: /ad-sponsor
网关配置application.yml:
zuul:
prefix: /imooc
routes:
sponsor:
path: /ad-sponsor/**
serviceId: eureka-client-ad-sponsor
strip-prefix: false
这段代码是基于Spring Cloud Zuul的配置,用于定义Zuul网关的路由规则。以下是对这段配置的详细解析:
配置解析
1. zuul.prefix: /imooc
-
作用:为所有通过Zuul网关的请求添加一个统一的前缀
/imooc
。 -
示例:如果客户端请求
http://<gateway-host>/imooc/ad-sponsor/...
,则该请求会被Zuul网关处理。
2. routes.sponsor
-
定义了一个路由规则,名称为
sponsor
。
3. path: /ad-sponsor/**
-
作用:定义了该路由规则匹配的路径模式。
-
含义:所有以
/ad-sponsor/
开头的请求路径都会被匹配到这个路由规则。 -
示例:请求路径
/imooc/ad-sponsor/api/v1/some-endpoint
会被匹配到这个路由。
4. serviceId: eureka-client-ad-sponsor
-
作用:指定当请求匹配到
/ad-sponsor/**
时,Zuul网关会将请求转发到Eureka服务注册中心中名为eureka-client-ad-sponsor
的服务。 -
含义:
eureka-client-ad-sponsor
是服务提供者在Eureka服务注册中心注册时的服务ID。 -
示例:如果
eureka-client-ad-sponsor
服务的实际地址是http://localhost:8081
,则请求http://<gateway-host>/imooc/ad-sponsor/api/v1/some-endpoint
会被转发到http://localhost:8081/api/v1/some-endpoint
。
5. strip-prefix: false
-
作用:控制是否在转发请求时去掉匹配的前缀。
-
含义:
false
表示不会去掉匹配的前缀/ad-sponsor/
。 -
示例:请求
http://<gateway-host>/imooc/ad-sponsor/api/v1/some-endpoint
会被完整转发到http://localhost:8081/ad-sponsor/api/v1/some-endpoint
。
总结
这段配置的作用是:
-
定义了一个路由规则
sponsor
,匹配所有以/imooc/ad-sponsor/
开头的请求。 -
将匹配到的请求转发到Eureka服务注册中心中名为
eureka-client-ad-sponsor
的服务。 -
在转发请求时,保留原始请求的路径(不去掉
/ad-sponsor/
前缀)。
注意事项
-
服务注册:确保
eureka-client-ad-sponsor
服务已经正确注册到Eureka服务注册中心。 -
路径匹配:客户端请求的路径必须以
/imooc/ad-sponsor/
开头,否则不会匹配到该路由规则。 -
转发路径:由于
strip-prefix: false
,服务提供者需要能够处理完整的路径(包括/ad-sponsor/
前缀)。
5.数据库表主键
目前的表设计主键大多都是 int 或者 bigint,极少数才会使用 string 类型的。整数类型占用空间少,且索引速度快。而且对于绝大多数场景来说,int 类型有 20 亿的上限,基本上都是够用的。
三、MySQL
1.慢查询
如何处理慢查询
一般数据表查询,超过一分钟的都是不可以接受的了。可以考虑从两方面去解决这个问题:
1. 根据查询条件建立对应的索引
2. 将数据构造成索引放在 redis 这样的缓存里面
常见的处理方法:
1.添加索引,需要经常查询的字段都要添加,主键本身就是索引,按照主键查询记录效率是最高的;如果有多个字段都需要有索引,且是同时查询(即 where 条件有多个),一定要使用联合索引。
2. 避免使用 *
,指定具体字段。如果表中包含的列特别多(例如超过20个),或者其中的几列存储的数据过