尚硅⾕微服务分布式电商项⽬《⾕粒商城》基础篇学习总结
尚硅⾕微服务分布式电商项⽬《⾕粒商城》基础篇
⾕粒商城是⼀个微服务项⽬,总体上分为前台购物模块和后台数据管理模块。其中后台管理系统基于SpringBoot + SpringCloud + SpringCloud Alibaba + MyBatis-Plus 实现,包括:系统管理、商品系统、优惠营销、库存系统、订单系统、⽤户系统、内容管理等七⼤模块。本⽂基于对《⾕粒商城》基础篇(后台数据管理模块)的学习,对其中所应⽤到的相关技术及知识点进⾏总结。
1.分布式基础概念
本项⽬主要涉及微服务、注册中⼼、配置中⼼、远程调⽤、Feign、⽹关等相关分布式基础概念
1.1微服务
微服务是⼀种⽤于构建应⽤的架构⽅案。微服务架构有别于更为传统的单体式⽅案,可将应⽤拆分成多个核⼼功能。每个功能都被称为⼀项服务,可以单独构建和部署,这意味着各项服务在⼯作(和出现故障)时不会相互影响。
微服务最⼤的特点就是独⽴、⾃治。在本项⽬中每⼀个不同功能的项⽬都创建了它⾃⼰的服务,不同功能的项⽬可以实现并⾏开发、互不影响。
1.2注册中⼼和配置中⼼
注册中⼼可以说是微服务架构中的”通讯录“,它记录了服务和服务地址的映射关系。在分布式架构中,服务会注册到这⾥,当服务需要调⽤其它服务时,就这⾥到服务的地址,进⾏调⽤。
配置中⼼:顾名思义将配置中⼼化,说⽩了就是将配置从应⽤中抽取出来,统⼀管理,优雅的解决了配置的动态变更、权限管理、持久化、运维成本等问题。
本项⽬中使⽤Nacos作为服务的注册中⼼和配置中⼼,便于服务间的互相调⽤和配置的统⼀管理。
Nacos的使⽤
1. 引⼊相关依赖
<!--服务的注册/发现-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--配置中⼼来做配置管理-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2. 添加配置⽂件
spring.application.name=gulimall-product
spring.cloud.nacos.discovery.server-addr:127.0.0.1:8848
spring.fig.server-addr=127.0.0.1:8848
spring.fig.namespace=668f4a9f-acea-4bd9-9ee4-cba0a8d98806
3. 启动类添加相关注解
@EnableDiscoveryClient
1.3远程调⽤
远程调⽤:在服务开发期间存在远程调⽤的场景,在本项⽬中服务的远程调⽤是由Feign来实现的。⽽使⽤Feign进⾏远程调⽤的前提则是服务被注册到注册中⼼。
Feign的使⽤
1. 引⼊相关依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2. 添加相关注解
@EnableFeignClients(basePackages="包名")
3. 编写远程调⽤类并指定远程调⽤的服务名和路径
@FeignClient("gulimall-coupon")
public interface CouponFeignService {
//到gulimall-coupon服务,给/coupon/spubounds/save发送请求。
@PostMapping("/coupon/spubounds/save")
R saveSpuBounds(@RequestBody SpuBoundTo spuBoundTo);
}
4. 在需要远程调⽤的⽅法中调⽤该⽅法
R r = couponFeignService.saveSpuBounds(spuBoundTo);
1.4 API ⽹关
API ⽹关是⼀个反向路由,屏蔽内部细节,为调⽤者提供统⼀⼊⼝,接收所有调⽤者请求,通过路由机制转发到服务实例。
本项⽬中使⽤Gateway作为⽹关,所有的请求都发送给⽹关,由⽹关代理给其他服务。我们可以在⽹关处做很多统⼀的处理,如:统⼀的跨域解决。
Gateway使⽤
1. 创建Gateway服务
2. 将服务注册到注册中⼼
spring.application.name=gulimall-gateway
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
3. 配置请求转发
spring:
cloud:
gateway:
routes:
- id: product_route
uri: lb://gulimall-product
predicates:
- Path=/api/product/**
filters:
- RewritePath=/api/(?<segment>.*),/$\{segment}
4. 其他统⼀处理(如:统⼀跨域处理)
@Configuration
public class GulimallCorsConfiguration {
@Bean
public CorsWebFilter corsWebFilter(){
UrlBasedCorsConfigurationSource source =new UrlBasedCorsConfigurationSource();
CorsConfiguration corsConfiguration =new CorsConfiguration();
//1.配置跨域
corsConfiguration.addAllowedHeader("*");
corsConfiguration.addAllowedMethod("*");
corsConfiguration.addAllowedOrigin("*");
corsConfiguration.setAllowCredentials(true);
return new CorsWebFilter(source);
}
}
2.基础开发
在对后台管理系统的开发中我们使⽤SpringBoot 对项⽬进⾏搭建,简单使⽤了SpringCloud 的Nacos、Feign 、Gateway 实现项⽬的注册与发现、配置管理、请求转发等。前端代码则是基于Vue组件化开发,对于图⽚的存储我们使⽤了第三⽅服务——阿⾥云对象存储。
2.1 阿⾥云对象存储OSS
阿⾥云对象存储服务(Object Storage Service,简称OSS),是阿⾥云提供的海量、安全、低成本、⾼可靠的云存储服务。
即开即⽤,⽆需维护,按量收费。
资源术语:
存储空间(Bucket):存储空间是⽤户⽤于存储对象(Object)的容器,所有的对象都必须⾪属于某个存储空间。
对象(Object):对象是OSS存储数据的基本单元,也被称为OSS的⽂件。对象由元信息(Object Meta),⽤户数据(Data)和⽂件名(Key)组成,并且由存储空间内部唯⼀的Key来标识。
Region(地域):Region表⽰OSS的数据中⼼所在物理位置。
Endpoint(访问域名):Endpoint表⽰OSS对外服务的访问域名。OSS以HTTP RESTful API的形式对外提供服务,当访问不同的Region的时候,需要不同的域名。通过内⽹和外⽹访问同⼀个Region所需要的Endpoint也是不同的。例如杭州Region的外⽹Endpoint是oss-cn-hangzhou.aliyuncs,内⽹Endpoint是oss-cn-hangzhou-internal.aliyuncs。
AccessKey(访问密钥):AccessKey简称AK,指的是访问⾝份验证中⽤到的AccessKeyId和AccessKeySecret。OSS通过使⽤AccessKeyId和AccessKeySecret对称加密的⽅法来验证某个请求的发送者⾝份。AccessKeyId⽤于标识⽤户;AccessKeySecret是⽤户⽤于加密签名字符串和OSS⽤来验证签名字符串的密钥,必须保密。
图⽚上传⽅式:
1. 普通上传⽅式
2. 服务端签名后上传
本项⽬选择服务端签名后上传的⽅式实现图⽚的存储功能。即保障了安全性,⼜避免给服务器造成过多的压⼒。
具体步骤:
1. 开启RAM访问控制,创建拥有指定权限的⼦账户,使⽤⼦账户进⾏图⽚上传操作。
2. 引⼊依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alicloud-oss</artifactId>
<version>2.2.0.RELEASE</version>
</dependency>
3. 编写相关配置
spring:
cloud:
alicloud:
secret-key: XXXXXXXXXXXXXXXXXX
access-key: XXXXXXXXXXXXXXXXXX
oss:
endpoint: oss-cn-hangzhou.aliyuncs
bucket: XXXXXXXXXXX
4. 按照OSS 的java SDK 编写controller分布式和微服务的关系
@RestController
public class OssController {
@Autowired
OSS ossClient;
//
@Value("${spring.cloud.dpoint}")
private String endpoint;
private String endpoint;
@Value("${spring.cloud.alicloud.oss.bucket}")
private String bucket;
@Value("${spring.cloud.alicloud.access-key}")
private String accessId;
@Value("${spring.cloud.alicloud.secret-key}")
private String accessKeySecret;
@RequestMapping("/oss/policy")
public R policy(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String host =""+ bucket +"."+ endpoint;// host的格式为 dpoint
// callbackUrl为上传回调服务器的URL,请将下⾯的IP和Port配置为您⾃⼰的真实信息。
//String callbackUrl = "88.88.88.88:8888";
String format =new SimpleDateFormat("yyyy-MM-dd").format(new Date());
String dir = format+"/";// ⽤户上传⽂件时指定的前缀。
Map<String, String> respMap=null;
try{
long expireTime =30;
long expireEndTime = System.currentTimeMillis()+ expireTime *1000;
Date expiration =new Date(expireEndTime);
/
/ PostObject请求最⼤可⽀持的⽂件⼤⼩为5 GB,即CONTENT_LENGTH_RANGE为5*1024*1024*1024。
PolicyConditions policyConds =new PolicyConditions();
policyConds.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE,0,1048576000);
policyConds.addConditionItem(MatchMode.StartWith, PolicyConditions.COND_KEY, dir);
String postPolicy = atePostPolicy(expiration, policyConds);
byte[] binaryData = Bytes("utf-8");
String encodedPolicy = Base64String(binaryData);
String postSignature = ossClient.calculatePostSignature(postPolicy);
respMap =new LinkedHashMap<String, String>();
respMap.put("accessid", accessId);
respMap.put("policy", encodedPolicy);
respMap.put("signature", postSignature);
respMap.put("dir", dir);
respMap.put("host", host);
respMap.put("expire", String.valueOf(expireEndTime /1000));
}catch(Exception e){
// Assert.Message());
System.out.Message());
}finally{
ossClient.shutdown();
}
return R.ok().put("data",respMap);
}
}
5. vue编写代码完成图⽚上传
3.环境
在环境的部署上,采⽤了Linux+Docker的⽅式,使⽤Docker来部署MySQL,在项⽬开发中我们使⽤了逆向⼯程&⼈⼈开源为我们快速⽣成基础的CURD的Controller、Service、Dao层代码以及Vue页⾯层的代码,开发时专注于复杂逻辑的处理即可。
3.1 Vagrant 快速构建虚拟开发环境
Vagrant是⼀款⽤于构建及配置虚拟开发环境的软件,基于Ruby,主要以命令⾏的⽅式运⾏。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论