项目之一:分布式/微服务架构/springColud
1.分布式架构的由来:
第一版:程序和数据库在一台应用服务器上
第二版:数据库和系统分开两个服务器
第三版:出现集群
第四版:部署多台服务器,出现负载均衡,session跨域问题随之而来,一般使用cookie来解决这个问题,在cookie中保存access_token,当向服务器发送请求的时候,服务器会拦截并解析这个token,判断有效期,用户是否存在
第五版 高性能的数据库
第六版 数据库的读写分离
一般的电商网站,重在查询,所以将数据库多读写分离,这个时候有个问题需要解决,那就是两个数据库之间的数据同步问题
将业务单独出来,写成一个服务,不同服务之间通过网络协议进行方法的调用
第七版 加入搜索引擎
第八版 加入缓存:在查询前,查询缓存中的数据,如果没有在去数据库中查找
第九版 数据库水平、垂直拆分
当数据量达到一定级别后,一张表成不下所有的数据,所以需要拆表
垂直拆分:不同业务的表拆分,比如一个商品表就是一个数据库,将不同业务的表拆成不同的数据库
2.分布式架构的构成拆分案例
前言:随着拆分的越多,出现的代码重叠性就可能越高,这是避免不了的,只能随着整体进行优化 ,剔除重叠部分,相较之前的单体项目我们选用微服务的分布式项目开发轻松了不少,解决了不少开发者的矛盾,但是却需要增加维护成本。
伴随着模块拆分的多样化我们需要选用一个可以进行统一站点管理的服务,本章节选用的是Eureka,作为我们的注册中心进行统一管理, 多服务的注册让我们更容易查看和分解。
Eureka中心模块:
启动class:
@EnableEurekaServer
@SpringBootApplication
xml:
Eureka jar:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-netflix-eureka-server</artifactId> </dependency>
熔断 jar:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
config jar:(需要使用config-client模块)不使用可以不用引入
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
properties:
eureka.instance.hostname=${spring.cloud.client.ip-address} # 优先使用IP地址作为主机名标识 eureka.instance.prefer-ip-address=true # 不向注册中心注册自己 eureka.client.register-with-eureka=false # 不需要检索服务 eureka.client.fetch-registry=false eureka.server.enableSelfPreservation=false eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/ # 关闭自我保护 eureka.server.enable-self-preservation=false # 清理无效节点时间(10 * 1000) eureka.server.eviction-interval-timer-in-ms=10000 # 刷新readCacheMap的时间 eureka.server.response-cache-update-interval-ms=3000
gateway 服务模块:
除此之外,我们需要为我们的服务做一个安全的防护,不能让所有的人去访问我们的接口,这样的话我们的服务就没有隐私可言了。
此处我用的是gateway去做的Eureka接口的验证处理,拦截验证IP的请求,我们可以将gatway作为单独的一个模块去引入我们的Eureka,这样的话模块被调用时就不需要多个路径IP,只需要通过调用gatway的IP端口尾缀拼接其他模块的路径,就能访问到其他模块的的逻辑功能,这样就能达到多模块路径统一IP和端口。
启动class:
@SpringBootApplication
xml:
gateway相关jar:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-gateway-webflux</artifactId> </dependency>
熔断机制jar:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
properties:
固定配置: spring.cloud.gateway.globalcors.cors-configurations.'[/**]'.allow-credentials=true spring.cloud.gateway.globalcors.cors-configurations.'[/**]'.allowed-headers[0]=* spring.cloud.gateway.globalcors.cors-configurations.'[/**]'.allowed-origins[0]=* spring.cloud.gateway.globalcors.cors-configurations.'[/**]'.allowed-methods[0]=* spring.cloud.gateway.globalcors.cors-configurations.'[/**]'.max-age=3628800 模块添加配置:新增模块必须配置相 #模块名字 spring.cloud.gateway.routes[1].id=login-service #模块地址 spring.cloud.gateway.routes[1].uri=lb://login-service #固定路径 spring.cloud.gateway.routes[1].predicates[0].name=Path #访问模块前缀 spring.cloud.gateway.routes[1].predicates[0].args[pattern]=/login/** spring.cloud.gateway.routes[1].filters[0] = StripPrefix=1
Config-Client 服务模块:
伴随着模块的越来越多,相应的配置也会在.properties文件中也变多,而我们就可以将某些固定且必要的或者不会变更的配置单独存放在一个文件中,这样的话就会达到快速配置的效果,不用再去重复繁杂的配置
1.我们之前的配置是将数据库连接,redis配置,rabbitMq配置,storage模块配置统一写在 .properties文件中去
2.这样每次新增加一个模块就需要去配置这些东西过程比较繁杂
本章节用的是本地配置讲解:
启动class:
@SpringBootApplication
@EnableConfigServer
@EnableEurekaClient
@Configuration
xml:
config jar: <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency> 熔断jar: <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
properties:
############################## config-client配置 ############################### #本地配置 native spring.profiles.active=native #文件存放路径 XXXXX为文件路径(记得更改成你的真实路径) spring.cloud.config.server.native.search-locations=file:///D:/XXXX/XXXX/ConfigServer #配置文件存放地址名称 spring.cloud.config.server.native.--search-locations=classpath:/ConfigServer
模块(例子)
启动class:
@SpringBootApplication @EnableEurekaClient @EnableFeignClients @EnableScheduling @MapperScan("指定XML路径名字,或者 * 即可")
xml:
引入正常模块依赖即可
properties:
############################## config-client配置 ############################### spring.cloud.config.discovery.enabled=true
#Eureka 上注册的config-client 服务的名字 spring.cloud.config.discovery.service-id=config-server
#本地配置文件 以点结尾尾缀名字 config文件配置 spring.cloud.config.profile=dev