runnable也是可以有返回值的,但是要传入一个对象
线程池一般只有一两个。
execute和submit都可以提交任务
线程池可以避免资源耗尽的问题。
线程池的七大参数和工作原理
核心线程用完了,再把任务放到阻塞队列里面。阻塞队列也满了,再继续增加新线程,但是不超过最大线程数量,最大线程数也满了,就使用拒绝策略。max里面的任务执行完了以后,经过一定时间,释放线程,但是核心线程core是不释放的。
异步的好处
先带着sku的id查相关信息,把前三个任务完成,
再根据sku的基本信息,查到对应spu,做任务4,5,6
运行一个异步任务,提交到创建的线程池,返回一个CompletableFuture<T>对象
CompletableFuture<Void> future = CompletableFuture.runAsync( () -> {
xxxxxxxx;
},executor );
这是一个函数式接口,有返回值
有返回值的异步任务,supplyAsync方法
使用whenComplete。
在后面继续.exceptionally(throwable ->{
return 10;
},可以感知异常,并且返回自己设定的默认值。
用handle()方法处理异步的返回。
线程的串行化:
thenRun是用之前的旧线程继续执行,thenRunAsync()是开启一个新的线程异步执行。
这个没法感知到上一步的执行结果 。
弄清楚三个的区别。
注意CompletableFuture.allOf()和CompletableFuture.anyOf()的区别,allOf是没有返回值的,需要从任务中get,anyOf是有返回值的。
配置页面跳转
XShell连接上虚拟机,配置nginx
cd/mydata/nginx/conf/
cd conf.d/
vi gulimall.conf
再配置网关
把详情页的文件复制到商品服务的resource里面
把静态的文件夹上传到nginx上
修改检索服务的list.html
展示sku的页面信息
获取路径中的变量用@PathVariable("skuId")
封装一个skuItemVo,包含了页面需要的所有信息。
在接口中创建出需要的方法,并在实现类中实现方法。
封装这几个信息
有嵌套属性的话需要封装自定义结果集
查找出来以后通过model展示页面
中间跳过了几集前端的
通过线程池和ComplatableFuture进行异步编排优化
整体架构图
认证中心集成多个功能 ,创建认证服务模块
注意看,文件夹是放到nginx里面,而.html文件是放到resource的template文件夹里
放在虚拟机的mydata/nginx/html/static目录下面
配置网关路由到指定的地址
登陆页面是可以直接访问到,但是reg.html注册页面不可以,因为只有index.html是mvc
绑定单击事件
这个一配置就可以不用写前面那个control了
短信验证码功能:购买阿里云短信接口
请求头里添加个key,之前那些都是在params里面
配置prefix
配置yaml文件的host,path等
验证码的检验以及防止60秒内多次刷新发送
把页面错误都放到model里面
收集到了错误
看debug界面
注意左下角的放行按钮
路径映射默认是get,所以请求转发会产生错误
重定向,把model改成redirectAttributes
利用的是session原理 ,跳到下一个页面取出数据后,会把session里的数据删除掉。
验证验证码是否正确,通过和redis里存放的值进行比较,这就是一种令牌机制
微服务之间传的是jason数据,所以得RequestBody
注意看,这个this.baseMapper其实就是MemberDao
创建查找默认会员等级的sql语句,写在相应的Dao.xml文件里面
注意看,这里调用的是刚创建出来的实现类自己的方法
编写异常类,继承runtimeException,使得校验没通过的话不用返回值,直接抛异常。
在方法中throw异常。
注意看querywrapper的使用,这个selectCount方法其实是BaseMapper自带的
这个异常的话,先是抛给regist方法,然后再抛给上层的controller
下面内容是密码加密的内容,p217
是一个信息摘要算法,严格来说不是加密算法。只要内容不变,计算出的值就不变,并且md5算出的值是不可逆的。
如图获取md5加密的值
将明文和密文进行匹配
如上图,将密码进行加密存储
在枚举类中保存相应的异常信息
还是刚才的regist方法,根据不同的异常类型,返回不同的结果。注册功能就写好了,但是在注册页面点击注册,是发给auth服务的 ,所以在auth服务中创建feign类,在loginController中调用刚才写的功能,如下图。
如上图member服务已经注册到了nacos中
如上图,验证注册功能,当确认输入的验证码和存在redis里的验证码(有过期时间)一致的时候,直接删除redis里存的。
所有注册页和登录页的前置地址,一定要加上自己的域名,要不然静态资源不能过nginx嘛,就访问不到了。
写一个vo用来收集登陆页面输入的用户名和密码。
完成会员服务里的登录功能
注意了,远程调用功能要把全路径都写上
如上图,在auth服务中调用远程服务,完成功能
下面是auth2.0社交登录还有单点登录的功能,新开一个帖子记录。