springcloud商城项目(springcloud电商项目)
基于SpringCloudAlibaba货币交易系统项目
项目简介
开源数字货币交易所,基于Java开发的比特币交易所,包含BTC交易所、ETH交易所、数字货币交易所、交易平台、撮合交易引擎等核心模块。项目技术采用业界最流行、社区非常活跃的开源组件Spring Cloud Alibaba来构建我们的交易系统,是行业第一家基于Alibaba技术的大型项目,也是Spring Cloud的最佳实践之一。
学习完本项目,大家将对云架构、区块链、法定数字货币、金融科技以及货币发展有自己更深入的认识和理解,为以后20年中国CDBD的研究和发展作出自己的贡献,同时也为争取40w的年薪增加一份可靠的技术保障!
适合对象
在职程序员的自我提升
有Spring Cloud/Spring Cloud Alibaba基础的学员
有Vue/React的基础的学员
有k8s/Docker运维基础的学员
技术选型
Spring Cloud Alibaba + Spring Boot + Tio + Jenkins + Maven + Jetcache + Disruptor + Redis + RocketMQ + Mongodb + Jenkins + Docker + Kubernetes
解决方案
核心功能模块
后台管理系统
前台系统
项目截图
后台管理系统
前台系统
项目架 构
撮合引擎
SpringCloud入门搭建及服务调用
开发工具:idea 2020.2.3
java:1.8
maven:3.3.9
SpringBoot:2.1.3.RELEASE
SpringCloud:Greenwich.SR5 (版本和SpringBoot必须对应,对应表自行百度)
idea配置我就不细说了
然后next
finish
然后配置pom.xml:
一般在父项目配置
然后配置依赖,这里只是一个springboot项目,所以配一个springboot就行了:
然后配置pom.xml,它们俩都是独立的springboot项目了,这里也可以和父类工程做依赖继承,但是这里就没必要,更凸显服务的独立性:
controller:
power启动类:
UserController.java
在这里调用另一个服务power服务的接口,可以使用reatTeplate来实现,需要配置
reaTeplate配置文件:AppConfig.java
user服务启动类:
user服务的 application.yml
同样可以以相同方式在power服务中调用user的接口
然后在浏览器:
127.0.0.1:6060/power/getPower.do(6060是power服务的端口)
127.0.0.1:7070/user/getUser.do调用自己的接口(7070是user服务的端口)
127.0.0.1:7070/user/getPower.do调用power的接口
至此实现了不同服务之间的调用
SpringCloud Alibaba 实战,来自尚硅谷电商项目理解
电商项目常见解决技术搭配方案:
SpringCloud Alibaba --nacos:注册中心
SpringCloud Alibaba --nacos:配置中心
SpringCloud --Ribbon:负载均衡
SpringCloud Alibaba --Sentinel:服务容错(限流、降级、熔断)
SpringCloud --Gateway:API网关(webflux编程模式)
SpringCloud --Sleuth(调用链监控)
SpringCloud Alibaba --Seata:分布式事务解决方案
作用:因为都会用到springcloud alibaba,所以将 放到公共服务中,统一管理版本
Nacos 文档地址:
Nacos 下载地址:
第一步:在需要注册到nacos的服务pom文件中添加相应的nacos依赖
作用:将我们的服务注册到注册中心中,同时也可以从注册中心中发现其他服务
第二步:将 Nacos 服务器地址配置添加到 /src/main/resources/application.properties 文件中,
给当前服务命名
第三步:使用@EnableDiscoveryClient 注解开启服务注册和发现
启动 Nacos 服务器
下载 Nacos Server下载页面
将下载的文件解压,进入nacos/bin文件夹(),并根据操作系统的实际情况
Linux/Unix/Mac , 执行 sh startup.sh -m standalone
Windows , 执行 cmd startup.cmd
查询服务
用户名和密码默认都是nacos
如:member会员服务需要调用coupon优惠券服务的方法
1.在member服务和coupon服务的pom文件中引入feign依赖
2.开启feign功能,在member服务上开启
@FeignClient("gulimall-coupon"):其中gulimall-coupon为nacos注册的被调用的服务名,@RequestMapping("/coupon/coupon/member/list")路径为gulimall-coupon服务中membercoupons()方法的调用全路径(添加上controller上的请求路径)
对应的在gulimall-coupon服务中有membercoupons()方法的具体实现
第一步:引入 Nacos Config 进行配置管理
第二步:在需要管理配置的服务下,添加bootstrap.properties
第三步:需要给配置中心添加数据集(Data Id)gulimall-coupon.properties
第四步:给 应用名.properties 添加任何配置
第五步:在需要读取配置的类上添加注解@RefreshScope,实时刷新获取配置文件内容
@RefreshScope:动态获取并刷新配置
@Value("${配置项的名}")
细节部分:
1.命名空间:主要用来做配置隔离
默认是public(保留空间);默认新增的所有配置都在public空间
a:开发、测试、生产:利用命名空间来做环境隔离
b:每一个微服务之间互相隔离配置,每一个微服务都创建自己的命名空间,只加载自己命名空间下的所有配置
2.配置集
一组相关或者不相关的配置项的集合称为配置集。在系统中,一个配置文件通常就是一个配
置集,包含了系统各个方面的配置。例如,一个配置集可能包含了数据源、线程池、日志级
别等配置项。
3.配置集ID
Nacos 中的某个配置集的 ID。配置集 ID 是组织划分配置的维度之一。Data ID 通常用于组
织划分系统的配置集。一个系统或者应用可以包含多个配置集,每个配置集都可以被一个有
意义的名称标识。Data ID 通常采用类 Java 包(如 com.taobao.tc.refund.log.level)的命名
规则保证全局唯一性。此命名规则非强制。
4.配置组
Nacos 中的一组配置集,是组织配置的维度之一。通过一个有意义的字符串(如 Buy 或
Trade )对配置集进行分组,从而区分 Data ID 相同的配置集。当您在 Nacos 上创建一个
配置时,如果未填写配置分组的名称,则配置分组的名称默认采用 DEFAULT_GROUP 。配置
分组的常见场景:不同的应用或组件使用了相同的配置类型,如 database_url 配置好
MQ_topic 配置。
加载多配置文件:
官方文档:
项目地址:
随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,
从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
什么是熔断降级
除了流量控制以外,降低调用链路中的不稳定资源也是关键 Sentinel 的使命之一。由于调用关系的复杂性,如果调用链路中的某个资源出现了不稳定,最终会导致请求发生堆积。
Sentinel 和 Hystrix 的原则是一致的: 当检测到调用链路中某个资源出现不稳定的表现,例如
如请求响应时间长或异常比例升高的时候,则对这个资源的调用进行限制,让请求快速失败,
避免影响到其它的资源而导致级联故障。
熔断降级设计理念
在限制的手段上,Sentinel 和 Hystrix 采取了完全不一样的方法。
Hystrix 通过 线程池隔离 的方式,来对依赖(在 Sentinel 的概念中对应 资源)进行了隔
离。这样做的好处是资源和资源之间做到了最彻底的隔离。缺点是除了增加了线程切换的成
本(过多的线程池导致线程数目过多),还需要预先给各个资源做线程池大小的分配。
Sentinel 对这个问题采取了两种手段
a.通过并发线程数进行限制
b.通过响应时间对资源进行降级
步骤:
1、引入依赖
2、使用 Nacos 注册中心
3、定义 fallback 实现
在服务消费者中,实现 feign 远程接口,接口的实现方法即为调用错误的容错方法
4、定义 fallbackfactory 并放在容器中
5、改造 fallback 类接受异常并实现容错方法
6、远程接口配置 feign 客户端容错
7、开启 sentinel 代理 feign 功能;在 application.properties 中配置
测试熔断效果。当远程服务出现问题,会自动调用回调方法返回默认数据。
SpringCloudAlibaba(一):概述与重要组件
前一篇提到了我们为什么要替换PHP语言采用Java语言。而Java语言的框架选型上来说有太多的选择,常见的有Dubbo,SpringCloud等。我们选择了SpringCloudAlibaba。替换PHP语言到SpringCloudAlibaba是个大工程,主要是业务迁移部分。讨论之初我也确认过是否迁移原有的业务,得到的明确答复是 迁移 。 那么这么来说也就简单了,复杂的就是工期问题了。
SpringCloud Alibaba是Alibaba结合自身的微服务实践开源的一套微服务全家桶 ,在SpringCloud项目中进行孵化并且毕业。既然是SpringCloud的项目那么阿里云其实包含其商业化的产品。 例如Nacos在阿里云就有其商业化的版本 MSE 。 同时SpringCloud Alibaba的相关组件是经历过双十一大促考验的产品。稳定性较高。
SpringCloud Alibaba是SpringCloud的子项目,其实很多相关的文章都提到了SpringCloud Alibaba与SpringCloud的关系,其中有很多的论点都比较有意思。大家可以去搜索一下。
SpringCloud Alibaba是依赖SpringCloud相关的标准实现的一套微服务的架构。结合阿里巴巴的相关实践与阿里云的相关服务实现的一些组件得以更快的实现相关产品业务。
Nacos实现了服务的配置中心与服务注册发现的功能,Nacos可以通过可视化的配置降低相关的学习与维护成本,实现动态的配置管理与分环境的配置中心控制。 同时Nacos提供了基于http/RCP的服务注册与发现功能。
Sentinel是面向分布式微服务架构的轻量级高可用的流控组件,以流量作为切入点,从流量控制,熔断降级,系统负载保护等维度帮助用户保证服务的稳定性。常用与实现限流、熔断降级等策略。
RocketMQ基于Java的高性能、高吞吐量的消息队列,在SpringCloud Alibaba生态用于实现消息驱动的业务开发,常见的消息队列有Kafka、RocketMQ、RabbitMQ等,相关的比较文档可以自行去翻阅。
既然是微服务的产品,那么肯定会用到分布式事物。Seata就是阿里巴巴开源的一个高性能分布式事物的解决方案。
Dubbo已经在圈内很火了,SpringCloud Alibaba基于上面提到的Nacos服务注册中心也同样整合了Dubbo。
SpringCloud Alibaba还有一些其他的组件选择,例如schedulerX、SMS、OSS等。但是由于其主要是阿里云的商业化产品就不再过多的进行介绍。集成其商业化产品时才能用到。
SpringCloud Alibaba是基于SpringCloud标准由阿里巴巴实现的微服务全家桶,可插拔的方式实现组件的替换,在某些场景中我们需要的组件可以自由进行选择。例如需要分布式链路跟踪我们可以增加sleuth组件用于实现分布式链路跟踪业务等。
很多人提到SpringCloudAlibaba的商业问题,记得当年SpringCloudAlibaba推出第一版的时候我也评论了...卖产品全家桶。不可否认是有那么一些,但是其实它本身的很多组件又不一定非要选择商业版本。这个可以自由进行选择。