为了账号安全,请及时绑定邮箱和手机立即绑定

《Java深入微服务原理改造房产销售平台》知识点梳理与问答总结

标签:
Java

《Java深入微服务原理改造房产销售平台》单体知识点

一图胜千言
图片描述

《Java深入微服务原理改造房产销售平台》微服务知识点

一图胜千言
图片描述

《Java深入微服务原理改造房产销售平台》日常答疑

  1. 既然已经在session有了,直接session取就行了,为什么要再放threadlocal,之后再从threadlocal清掉,一直从session拿不就行了?

答:
放在Threadlocal里面,是为了后面的Controller、Service、Dao任何地方只要是当前业务处理的线程都能 直接并且方便的 获取到用户对象. 如果我们不做这种处理,那只能从Session中获取,当Service里面要获取user的时候,Controller在调用service方法时就必须传递HttpServletRequest这种容器相关参数,增加了业务与底层实现的耦合,造成业务处理关注点的增多;而且每个Controller都需要接收HttpServletRequest参数,因为不能预估未来是否要获取user对象来逻辑处理。

2 nginx的配置中root和alias的区别?

答:
root和alias的区别是酱紫的:
配置root需要访问路径要叠加目录路径,比如配置了
location /images {
root /path/to/img;
}
那么有张图/path/to/img/a.jpg,那么浏览器中访问到这张图片就需要http://localhost:8081/images/path/to/img/a.jpg
而alias就简单多了,url中不需要关心本地目录路径
location /images {
alias /path/to/img;
}
http://localhost:8081/images/a.jpg 这样就能访问,所以建议使用alias,尤其是windows下 ;
如果非要使用root配置的话,那只能使用相对路径了,相对nginx的安装路径,比如
你将nginx安装在D:\nginx下
你可以将图片放在D:\nginx\img,比如你想访问D:\nginx\img\1.jpg,配置好:
location /images {
root img;
}
就可以通过http://localhost/images/1.jpg就可以了,
否则可以使用alias,就可以使用windows绝对路径了

3.freemarker的那些文件哪里可以下载?静态文件在哪里

答:
freemarker文件在单体工程house-web/src/main/resources/templates目录下,是以.ftl结尾的文件
图片文件在单体工程house-web/src/main/resources/static目录下

4.datasource 加载失败,空指针异常
答:
确保mysql驱动及Mybatis-Starter已经依赖,house-web已经依赖上了house-biz,并且配置文件中包含有spring.druid的配置

5.发现我的spring-boot 的配置文件不支持 的druid的 spring.druid.xx的属性格式,只能用spring.datasource.xx的格式,这是为什么?

答:
ConfigurationProperties注解有两种使用方式,一种是注解在Properties类上,作用是将application.properties(yaml)上的配置绑定到该类属性上,另外一种是注解在Bean方法上,作用是将作用是将application.properties(yaml)上的配置绑定到该bean方法返回对象上。前者通过注解处理器是可以生成/META-INF/metadata.json文件,用于IDE代码提示的,后者就无法生成也就IDE不能进行提示,再者,在Bean方法上注解@ConditionalOnProperty的property,IDE也无法提供提示。

你也考虑使用druid-spring-starter来替换DruidConfig,事先要删除DruidConfig。课程中使用DruidConfig是更加轻量可控的方式。

6.提示userService找不到
.答:
请检查service注解及package是否属于启动类所在package的子package。所有bean找不到,mapper找不到的错误,要先确保启动类
所在package是root package,SpringBoot默认会扫描root package下面的子package来发现Spring bean,这个尤其要注意

7 . Cannot expose session attribute 'user' because of an existing model object of the same name
答:
注释掉同名user的attribute设置

8.Error creating bean with name 'userController': Unsatisfied dependency expressed through field 'userService'
答:
首先看底层的mapper bean,datasource bean创建是否正常,数据库有没有连接上,然后再检查下application.properties的mybatis配置是否正确

9.用户模块一般作为独立的服务数据库,比如其它业务模块(订单模块) 我的每笔订单都是跟人绑定的。这里是需要用表join的。类似于这样的业务数据应该有很多,这样的表结构如何划分微服务。

答:
微服务改造时要以限定上下文进行拆分,假设订单和用户分属两个不同的限定上下文。根据实际经验,用户通常作为一个最基础的服务,用户涉及的关联关系很多,为防止用户服务变的过于庞大,关联关系往往分拆到其它领域模型中进行维护,比如订单用户关系会放在订单服务中维护。
微服务拆分后,对于订单查询的场景,可以从订单用户关系表中的userid来查询出订单id列表,然后通过订单id列表查询订单表。对于多维度条件、分页、范围查询的场景可以将用户和订单表合并成一个宽表输出到ES中,来解决跨库join的问题

10.分布式事务和消息队列的内容有涉及到吗

答:
会有涉及,因课程篇幅所限,会从理论上讲解,缺少代码实现部分,还请见谅

11.多库的数据统计问题,在实际应用中,拆为多库时,联表查询统计怎么处理?

答:
如果是应用中有复杂条件查询的逻辑,应该将多张数据表合并成宽表同步到ES中,进行查询.
数据统计应该和应用开发分离,由专门的团队负责,一般是将数据表定期或实时同步到hive表,通过hive sql进行离线统计。

12.在mapper接口上添加注解+SQL(比如select("select * from ..."))的方式,和课程中接口定义在类中,SQL语句定义在XML文件中这种方式,两者之间除了实现方式不同外还有其它区别吗?

答:
注解方式无法利用mybatis动态sql的功能,当sql变多变复杂将成为噩梦;对于数据库操作要求较高的项目如果进行sql审核将变得不方便;sql与代码放在一起,也难以维护

13.服务的消费者需要注册到注册中心吗,还是只需要服务的提供者注册到注册中心就行?
答:
对于SpringCloud Eureka只需要服务提供者注册,但同时要注意很多服务是 兼具这两种角色的--既是服务消费者又是服务提供者

14.为啥我实例在Eureka DashBoard不显示IPxxxx,而是显示机器名?

答:
添加一个配置eureka.instance.prefer-ip-address = true,如果还是机器名说明你本地只有一个回环地址127.0.0.1,那么
还需要加上eureka.instance.instance-id=${你的ip}:${你的port}才行

15.SpringCloud版本与Springboot的版本对应的问题

答:
虽然SpringCloud版本与SpringBoot没有强制对应关系,但是还是建议在选用SpringCloud版本时要同时选择与其兼容的SpringBoot版本。通过http://projects.spring.io/spring-cloud/#quick-start输入不同SpringCloud版本返回对应的SpringBoot版本

16.recomHouse变量没有值,Freemarker报错的问题,FreeMarker template error (DEBUG mode; use RETHROW in production!): The following has evaluated to null or missing: ==> recomHouses [in template "homepage/index.ftl" at line 107, column 27]

答:
recomHouses没有值,是不是还有学到推荐那一节,建议先注释掉,等学到热门推荐再解开

17.mybatis.config-location=classpath:/mybatis/mybatis-config.xml,这个是写在web下的,但config.xml是在biz下的,最后是怎么找到的

答:
最后打成一个jar包,jar包里面又包含biz的jar,所以能找到

18.能否简单介绍下服务拆分,对于一个像旧系统 用户表\组织表菜单\这些基础的真不知道如何下手呀
答:
服务拆分涉及很多,基本的拆分原则,组织架构,项目特点,业务场景,历史经验都有关系;
从业务功能之上来看服务拆分,而不是数据表 , 将每个 “联系紧密的业务 " 划定成一个限定上下文;
然后再分析限定上下文包含哪些业务模型,上下文 之间 可以分析出哪些共享模型

19.技术书都有哪些推荐

答:
《Java TCP/IP Socket编程》 网络编程快速入门,讲的通俗易懂
《Java并发编程实战》 并发编程经典书,必读
《Effactive Java 2.0》 Java编程的最佳实践,依然值得细读
《java并发编程的艺术》 引导你深入JDK并发包源码,建议边研究源码边参考本书
《从Paxos到Zookeeper分布式一致性原理与实践》 借助zookeeper组件的深入剖析,让你可以了解分布式系统领域的设计原理
《精通Spring 4.X:企业应用开发实战精通》 如果非要推荐一本Spring的书,我觉得陈雄华写的这本还是不错的,我看过Spring3.x企业应用开发实战,可以当做字典书
《Mysql技术内幕》 系列的书,可以让你了解Mysql的原理
《大型网站技术架构-核心原理与案例分析》及 《大型网站系统与Java中间件实践》 可以让你了解互联网系统架构的演进过程
《深入理解Java虚拟机》

20.feign的作用还有哪些常用的呢

答:它也是基于http,让你从复杂的http请求构建过程中解脱出来

21.Spring Cloud Config怎么样

答:
SpringCloud Config 它相比一些开源的分布式配置中心(Disconf, Dismond)还有一些差距,比如它不支持变更通知

22.我们应该对spring boot 的线程池进行设置吧。。还是默认的配置就能万金油了?

答:
并发量大,业务处理耗时较久的业务场景下要将线程数开大,比如如果你使用tomcat,那么在application.properties(yaml)中
添加配置server.tomcat.max-threads=2000

23.添加注解Async执行异步没有生效

答:
Spring处理异步是通过AOP来实现的,需要调用的Service与添加@Async方法的Service分开,同时@Async注解的方法不能有返回值(或者返回Future<T>),也不能定义为private

24.多环境配置的时,是通过pom定义多个profiles,还是定义多个application-*.yml(如:application-dev.yml)这样的文件

答:
生产环境建议使用的前者,因为不同环境,不止只有application.properties(yaml)不同,还有其它配置文件不同环境也不一样。

25.添加依赖后IDE没有生效

答:
如果使用Eclipse,使用Maven-Update Project..
如果使用Idea,选择Maven Projects -> reimport all maven projects

26.hystrix是不是都要在各个服务跟网关都需要配置实现呢

答:
要看具体业务情况,对外部业务依赖都应该配置,但API Gateway一定是配的最全的

27.这个课程为什么有没有讲到spring session

答:
像SpringSession、Spring Data Redis、Spring Kafka,我们生产环境都没有用,侵入性太强,不易定制化.
课程中更希望大家能理解解决方案的思路和原理,而不是方案的套用,否则无法达到举一反三的目的,引入spring很多技术栈也会带来不少维护成本

点击查看更多内容
47人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
JAVA开发工程师
手记
粉丝
1.7万
获赞与收藏
1006

关注作者,订阅最新文章

阅读免费教程

感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消