00:01
前面我们整合对象存储测试了一下文件上传,但是以后如果我们用这种方式进行文件上传,那我们浏览器就需要将文件先提交给我们这个V服务,我们服务呢再上传给对象存储,那这样做呢,太麻烦了,总是要经过我们应用服务器,所以我们说最希望的方式呢,应该是这样子的,浏览器可以直接将大文件提交给对象存储,而为了安全期见,他只需要找我们服务器要到相应的签名数据就行了。所以我们来整合一下这种方式,服务端签名后直传,而且呢,我们后来有非常多的第三方服务,我们要进行调用,比如我们对象存储,发送短信,查物流等等等等,那我们呢,就可以为整个项目创建一个专门的微服务,来整合各种第三方功能,好,我们在这呢创建一个model。把它呢,就叫古励mail third party group com,第二硅谷第二鼓励mail,那我们的这个artifact呢,我们就叫古丽meil third party。
01:10
这里呢,专门集中了我们所有的第三方服务。包名我们改一下描述呢,第三方服务。选择下一步,我们呢,先选中web开发场景。加上远程调用功能,选中open份,那剩下的注册中心、配置中心,我们直接依赖common就行了,选择下一步finish。那创建完成以后呢?我们先来修改它的依赖,我们让它也依赖common服务dependency。鼓励mail common,同时我们将对象存储的依赖放在这儿,我们就不放在common里边了,好,这一块呢,我们将对象存储单独提出来,那提出来呢,我们就得将依赖管理也放在我们set party里边,我们在set party里边呢,依赖管理两个,一个spring cloud的。
02:09
还有一个阿里巴巴的将dependency这些删掉,我们引入一下对象存储的相关start,把这个复制过来。放在这一块。那我们common里边的对象存储我们就不要了,如果我们在common里边引了对象存储,那我们其他服务呢,就得配对象存储相关的内容,但对象存储呢,是一个公共服务,我们就全部引在set party里边,同样第三方服务,整个微服务也要注册到注册中心以及配置中心的相关配置,把它填上。来填写一个bootrip点2PROPERTIES的配置文件,在这一块呢,我们配置上配置中心的相关信息,NAS con server a drr,我们先配配置中心的地址,我们是本机的127.0.0.1,冒号8848,这cos配置中心,同样它的名称空间,按照我们的约定,我们每一个微服务。
03:13
有自己的名称、空间。那我们在NAS里边呢,为third party创建它的名称空间,来到命名空间,先来重新登录一下。在命名空间里边,我们来点击新建,我们创建一个third party,这是第三方服务,那以后呢,我们第三方服务的所有配置我们都放在这个名称空间下,它可以有各种配置文件,我们在这呢把它复制过来,如果我们要加载哪些配置文件,我们可以在这儿指定一下,比如我们就将对象存储,我们先抽取成一个文件。Extend com,第一个点data ID,我们对象存储呢,我们专门给这创建一个。
04:00
配置,我们就叫对象存储oss,点页面。它呢是一个页面,我们将我们以前对象存储的内容复制过来。在product里边。将它里边的对象存储,相关配置们直接复制来当这块呢,还不够,它还有一个spring cloud前缀,我先放在这。我们给它加上spring cloud前缀冒号,冒号层级关系呢,写清楚k secret k是阿里cloud下的,那对象存储的信息呢,配在这,那点击发布,那我们第三方服务以后启动呢,就要加在这个配置文件,我们把它配在这一块,在第三方服务里边data ID,那就是它包括呢这个配置文件,那它都是在默认组里边,第二这有一个group,它所属的分组,我们可以给它写上是默认分组,包括呢我们这个配置文件里边的内容更新以后,要不要动态刷新,我们也加上这一块的配置,第2REFRESH给他写一个true。
05:09
这是我们配置中心相关的信息,那接下来呢,我们给第三方服务里边,我们再来创建一个application页面,编写我们当前应用的其他配置信息,包括注册中心地址等等,那先来编写上three.nus discovery server a DR,那注册中心呢,是127.0.0.18848。包括项目的名字我们也要配置过来,我们统一可以配在配置中心里边点application name,好,这个名字呢,就是我们第三方服务,我们也可以给面里边将这个配置添上spring.application name,这是我们第三方服务,而且我们third party呢引入了common。Common引了我们的myab相关的这些start,我们将这个呢也排除掉,要不然我们现在还不用操作数据库,我们还得配数据库相关的东西,那么在po文件中在引入common的时候将它排除,Exclusions exclusion dependency ID,把这两个呢都来写上,我们来启动第三方服务们,看是否能正确的注册到注册中心中,想要让他注册,首先第一个注解,Enable discovery client。
06:31
开启服务的注册发现,然后我们来运行主程序,而且呢,我们不配置端口,默认我们也是占用8080,所以我把它先停掉,我们不让他跟后台占用同一端口,我们在这呢,给他指定新的端口,Server port,第三方服务呢,我们让他占用3万端口重新启动。走。我们发现呢,服务已经正确启动了,我们来刷新一下NAS的服务列表,来到public里边,我们现在已经看到古ma萨party已经有了,同时我们测试一下文件上传还能不能用,来到单元测试里边,我们打开这个测试工具类,我们将之前的测试方法直接复制过来,我们将其他都关掉。
07:19
将这一块的测试呢,我们直接剪切放到我们第三方服务里边。把这些包呢导入进来product里边,由于没有经对象存储了,那就将这些都删掉。好,我们重新来测试一下文件上传。这个文件上传呢,比如我们这个文件名,我们给它起一个叫哈哈哈,这是最终在对象存储中存的文件名走运行。我们发现这一块呢,打印上传完成,我们验证一下来到对象存储里边。我们对象存储的控制台,我们刷新。
08:02
这块呢,就有哈哈这个图片了。那接下来我们要做的就是我们使用这种上传逻辑,向浏览器去服务端请求一个签名,然后利用这个签名携带真正的文件直接提交给对象存储,那这个签名要怎么使用,我们可以参照对象存储的官方文档,我们以前呢,看的是这个简单上传,我们一直往下翻,这有一个叫最佳实战,我们使用web端上传,Web端上传呢,我们最终要使用服务端签名后直传。这种的作用呢,就是我们浏览器在上传之前先找服务端要签名,要到以后呢,拿着签名,拿着真正的文件直接上传给对象存储,那这个签名该怎么获取,这有Java代码的示例,我们直接将它点开,这段示例呢,我们也复制过来,同样的还是要配置这么一些信息。最终呢,使用这段代码。
09:03
签名直传服务,用它呢,生成一个签名浏览器,就是使用这个签名直接提交内容的,那好我们将这一块的方法呢,直接复制过来。将它的方法体内容复制过来,我们呢,给浏览器创建一个请求,让浏览器能给我们发送请求,我们最终将签名给它传回去的,那我在第三方服务里边,我来写一个controller controller,我们就叫oss controller,这是我们对象存储专用的controlrler。这个controller呢?我们先来写上一个rest controller,由于我们要返回数据给浏览器,Rest controller就是普通的controller加response body,将请求体数据呢直接以杰森返回出去。啊,说错了,那是将响应题返回出去,好,我来写一个方法public,那先来写一个空方法,这个呢是要签名的。
10:07
我们将这段代码呢,直接复制过来。我们看我们缺少什么,这有oss client,我们导入进来。将其他的这些类我们全导入进来,日期工具类,把日期还有这个签名的这些条件类,以及匹配模式,这都是对象存储相关的依赖,好,包括将这一块map也导进来。Link的哈奇曼。以及我们这个。这块都导入进来以后呢,我们发现在这呢,使用map,给map里边放了一些属性数据,这些数据呢,最终以response,包括用跨域的方式响应出去,而跨域呢,我们后来在网关统一解决,所以我们就直接把这一块删掉,那此方法呢,就返回一个map。
11:03
这个map呢,最终要响应出去,我们只需要给它标response body。但是这个response body在controller已经。整个标过了,那我们每一个方法都不用写了,它都是。将返回的这个对象写成JS传给我们浏览器,那么来写一个请求匹配,那么就叫request twenty,浏览器发一个什么请求呢?就叫oss policy,哎,他去来要对象存储的相关签名数据,而签名的这些信息,Access key ID end point,包括整个oss client,我们都不用在这构造了,因为我们引入了start,我们只需要自动注入我们将oss client。我们自动注入进来即可使用owa,那这一块的构造呢,我们就不用了。我们在这直接使用oss,我们自动注入的,那接下来呢,这三个信息我们就可以暂时不用填,它是用来构造oss client的。
12:08
接下来呢,还有一个叫bucket,这个指的是我们要上传给哪个存储空间来看一下,那现在呢,有一个bucket叫鼓励mail hello,我们上传给这儿,所以我们将它配置过来。包括呢,最终我们上传给这以后,那么文件真正的访问地址,我们可以看一下我们已经上传好的这些文件,它的真正访问地址是我们的bucket的名字,加上我们后边的endpoint的名字,再加上我们文件的名字,它是这么一串,我们复制一下URL,我们将它粘贴到这。所以这一块呢,Host是拼装了bucket的名字及对象存储endpoint的名字,而整个host用在哪了呢?用在了给浏览器的返回上,相当于告诉浏览器它要给哪一块来上传文件,但这个endpoint呢,由于我们已经配置了,我们将所有的配置是抽取在了NAS里边,我们把它打开在配置列表里边,但为了方便,我们推荐大家将这一块的配置们先写在我们的配置文件中。
13:19
我们直接放在这儿,那我们以后要修改了,先来改配置文件,以后上线了,我们统一将它们呢放到配置中心中去,好,我们将这一块呢放在这,将这删掉,那endpoint的真正的值我们就不在这写死了,我们可以动态获取一下private string,那endpoint的值呢,我们拿过来,我们直接使用end value来获取一个数据,这个呢,就是从配置文件中获取,获取谁呢?直接do了幅大客号,我们想要获取的是。这个那就spring.cloud点阿里cloud复制一下spring.cloud点。
14:04
阿里cloud。我们来到这,阿里点一个。Oss,再点一个endpoint。那这个endpoint呢,就可以从配置文件中获取了,包括bucket。我们要上传给哪,如果这个是固定的话呢,我们也可以直接配在这个配置文件中,我们来写一个bucket,虽然这个配置文件呢,默认没有这个属性,但我们配上,我们也可以用我们自己的方式获取到,那我们bucket的名字呢,叫这个,那我们配在这,那我们想要获取呢,那一样private string。Bucket,那这一块呢,我们就不用我们这个了,那我们真正的bucket呢,我们也是从配置文件中获取,我们自己配的Dollar大号前缀呢,都一样,我们是存在哪个。
15:03
里边那我们配置文件这一块呢,也。而且大家注意这呢,有一个上传回调,我们暂时呢,先不用把它注掉,这个ID我们也是要获取的。所以我们在这呢,再来写一个private string ID,这ID呢,我们也value直接从配置文件中获取过来就行了,那还是spring cloud。阿里cloud,我们将这一块复制来,那ID它是在阿里cloud下有一个access key,这个就是我们说的ID。而且这有一个最关键的地方,就在这dar。D是我们上传文件时,我们指定的这个前缀,而这个前缀我们一般后来希望啊,我们文件不要上传给对象存储,直接全放在这个bucket下边,我们希望呢,以日期的方式为一个目录,比如我们2019年。
16:08
双11我们上传的东西,我们以日期的形式呢,组织一个目录,将它们放到这个目录底下,每一天都是产生一个新目录,所以我们在这一块呢,我们将前缀就不要固定写死了,这个前缀呢,我们生成一个日期格式化后的结果,我有一个simple date format,我们创建一个YYYY杠,MM杠,DD,年月日的,然后呢,我们用它格式化一个当前时间。只要浏览器请求我们要数据,那就以当前的服务器时间为准,我们将当天上传的都存在当天里边,那这一块的前缀你就删掉,用我们自己配的,那至此呢,我们这个签名方法我们就写好了。我们可以来测试一下,我们重新启动第三方服务,在这一块呢,可能我们删的时候有点不对,我们可以看一下这个提示,诶哦,缺少返回值,我们是要将整个map返回出去的,所以我们呢,在这来return我们这个map,那这个map呢,你就放在最前边。
17:21
他先呢,等于一个闹。在这一块呢,我们给他制作签名,制作完成以后,我们将它整体返回。重新启动我们这个第三方服务。我们发现呢,这有一个报错,说oss client,说我们需要的这个oss client这个类型的组件没有找到,没有找到的原因,我们分析一下它的自动配置,我们引入了oss的start,那就会有相应的自动配置。我们找一下oso configuration相关有这么三个自动配置,OS的自动配置,它环境的自动配置以及endpoint的自动配置。在OS auto configu里边,它给容器中放了一个协议解析器,这个跟我们没啥关系。我们再来看一下oss contest。
18:17
整个对象存储环境的自动配置,在这个自动配置里边呢,给我们at b容器中放了一个oss client,不过呢,它是以接口类型放的,那我们在这写自动注入的时候,我们写的这个实现类型那就不可以了,我们来写接口类型。好,奥英特,我们来导入,重新启动,测试启动。好,那这个服务启动起来呢,我们就给我们这个方法发送请求,要来签名数据,我们看一下长得是什么样子,打开3000端口,我们发送OS SOS policy回。
19:00
我们现在看到要的这些签名数据,Access ID,我们这有还有这个place策略,这是一个加密后的结果,这呢还有一个叫签名,后来阿里云会来验证这些,包括这Di指的是我们要给哪个文件进行上传,包括我们要上传到的主机地址,以及我们整个这个签名的过期时间,那以后我们浏览器想要上传文件,那就应该给我们后台服务先发送这个请求,要来这些相关的信息,然后带着这些信息以及要上传的文件提交给阿里云,阿里云去来进行校验以及存储上传的内容。另外呢,我们把它也加入到网关的控制,我们说以后所有的请求我们都希望发给八八端口,那我希望发给八八网关端口,我们都是以API前缀开始的,第三方的所有请求我们都以色。Party开始再来访问oss policy来,我们现在呢,这个还没有添加映射,我们来配置我们的网关,来到getway里边。
20:08
添加上我们的配置文件,点开application页面,我们现在呢,再来填一个,将所有精确的我们放在前边,剩下的没有匹配到的,已被API开始的都交给后台项目,也就是人人fast交给他最后就行了。那好,我们现在多填一个杠ID。这个呢,是咱们第三方所有服务的路由third party。刚肉。他要去的uri地址用来复制上,我们也是一样编写LB是负载均衡到哪个服务呢?所有。第三方的相关请求,我们都负载均衡到他这个服务。断言我们都是以API前缀加上我们这个thread party这个前缀,这些前缀的所有请求,那就路由给第三方服务,再来加上我们的filter过滤,我们也要进行路径重写,我们将这个复制过来。
21:12
只不过这一块的重写规则就是我们发送第三方请求会加thread party oss place,那我们最终只剩下后边的,前边的呢是需要截掉的,所以我们把这复制一下。要重写的路径API thread party,后边这一串全部截完,只留下我们动态的后边这一串路径配完以后呢,我们将网关也进行重启,由于我们第三方服务已经注册到注册中心了,所以我们只需要重启网关,让他动态的从注册中心来发现相关服务。那以后呢,我们就直接给网关发送请求,我们来验证一下这个逻辑。现在看一下网关有没有重启成功,好八八没问题,来验证一下这个逻辑回车。
22:01
现在呢,我们给网关发请求,也能要到我们对象存储的服务端签名数据,那下一节课呢,我们就跟前端进行联调,完成一个文件上传功能。
我来说两句