基于SpringCloud的广告系统设计与实现(三)

一、广告系统业务需求

广告投放数据的核心要素

  • 用户账户 -> 最高层级,用于定义广告主或代理商,只有有了用户才会有接下来的数据投放

  • 推广计划 -> 一类品牌或产品广告投放的规划,自身并不定义太多关于广告自身的信息,它会将信息打包下放到推广单元层级

  • 推广单元 -> 一个确定的广告投放策略,描述了投放广告的规则信息

  • 推广单元维度限制 -> 广告投放会有一些限制条件,例如只投放到北京、上海地区,对一些关键字进行投放等等 (这可能是比较难理解的概念,需要大家好好的思考)

  • 广告创意 -> 展示给用户看到的数据,可以是图片、文本或者一段视频

二、业务系统开发注意

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

总结

这段配置的作用是:

  1. 定义了一个路由规则sponsor,匹配所有以/imooc/ad-sponsor/开头的请求。

  2. 将匹配到的请求转发到Eureka服务注册中心中名为eureka-client-ad-sponsor的服务。

  3. 在转发请求时,保留原始请求的路径(不去掉/ad-sponsor/前缀)。

注意事项

  1. 服务注册:确保eureka-client-ad-sponsor服务已经正确注册到Eureka服务注册中心。

  2. 路径匹配:客户端请求的路径必须以/imooc/ad-sponsor/开头,否则不会匹配到该路由规则。

  3. 转发路径:由于strip-prefix: false,服务提供者需要能够处理完整的路径(包括/ad-sponsor/前缀)。

5.数据库表主键 

目前的表设计主键大多都是 int 或者 bigint,极少数才会使用 string 类型的。整数类型占用空间少,且索引速度快。而且对于绝大多数场景来说,int 类型有 20 亿的上限,基本上都是够用的。

三、MySQL

1.慢查询

如何处理慢查询

一般数据表查询,超过一分钟的都是不可以接受的了。可以考虑从两方面去解决这个问题:

    1. 根据查询条件建立对应的索引

    2. 将数据构造成索引放在 redis 这样的缓存里面

常见的处理方法:

1.添加索引,需要经常查询的字段都要添加,主键本身就是索引,按照主键查询记录效率是最高的;如果有多个字段都需要有索引,且是同时查询(即 where 条件有多个),一定要使用联合索引。
2. 避免使用 *,指定具体字段。如果表中包含的列特别多(例如超过20个),或者其中的几列存储的数据过

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值