Spring Cloud 实战
1. 框架定位有什么区别?
答:Dubbo只是RPC定位,Spring Cloud是微服务生态圈package
2. 框架通信模式有何不同?
答:Dubbo支持json等,而Spring Cloud以http(rest)为其协议,则可以支持所有以http为协议的语言,例如php。
3. Spring Cloud Config和Nacos有什么区别?
答:前者只是配置中心,后者是配置中心+服务发现中心,前者不提供权限支持,后者可以对配置中心的浏览进行权限配置。
4. Spring Boot的监控方案是什么?
答:Spring Boot Admin或者Acutator
5. Java编译工具的鄙视链是什么?
答:Gradle -> Maven -> Ant
6. Maven的一个重要命令是什么?
答:mvn clean package -Dmaven.test.skip=true -U 其中-U是指强行重新下载所有的依赖,让其自动更新到最新的。
7. 项目的版本是什么样的?
答:java jdk 1.8, maven 3.5.0, mysql 5.7,redis 4.X, Nacos,RabbitMQ,Sentinel 1.6.1。
8. 项目的安装文件是怎么样的?
# 导入代码前,记得先安装lombok插件,否则你的IDE会报代码缺失。
# root项目节点下面使用maven打包
mvn clean package -Dmaven.test.skip=true -U
# UI python + nodejs
#修改config/index.js 把 cloud.gateway.com 修改为自己的ip
或者 修改本机hosts添加:
127.0.0.1 cloud.gateway.com
192.168.100.28 cloud.gateway.com
npm install
#如果执行install慢的话就利用淘宝加速
#npm install --registry=https://registry.npm.taobao.org
npm run dev
###########################
# docker
###########################
# rabbitmq
docker run -d --name rabbitmq -p 5671:5671 -p 5672:5672 -p 4369:4369 -p 25672:25672 -p 15671:15671 -p 15672:15672 -p 15674:15674 -p 15670:15670 -p 15673:15673 --restart=always xiaochunping/rabbitmq:management
# redis, password
docker run -d --name redis -p 6379:6379 redis redis-server --requirepass "redis123456" --appendonly yes
# sentinel 1.6.1 http://192.168.100.240:8080
mvn clean package -Dmaven.test.skip=true -U
./build.sh
# nacos http://192.168.100.240:8848/nacos
# 修改standalone-mysql-study.yaml 数据库ip(mysql主从的ip)
docker-compose -f standalone-mysql-study.yaml start
# mysql
# 1、启动mysql主动容器
docker run --name mysql-master --privileged=true -v /home/mysql/master-data:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d xiaochunping/mysql-master
docker run --name mysql-slave --privileged=true -v /home/mysql/slave-data:/var/lib/mysql -p 3307:3306 --link mysql-master:master -e MYSQL_ROOT_PASSWORD=root -d xiaochunping/mysql-slave
# 2、进入主容器
docker exec -it mysql-master /bin/bash
mysql -uroot -proot
grant replication slave on *.* to 'test'@'%' identified by '123456';
flush privileges;
// 查看主的状态
show master status;
# 3、进入savle开启数据同步
docker exec -it mysql-slave /bin/bash
mysql -uroot -proot
change master to master_host='master', master_user='test', master_password='123456', \
master_port=3306, master_log_file='mysql-bin.000003', master_log_pos=589, master_connect_retry=30;
start slave;
// 查看从的状态
show slave status\G
9. 多个服务器如何控制?
答:用xshell来管理和登陆多个服务器。
10. 所有的服务器/服务都需要设置密码,例如redis,不然扫描端口之后会被塞进去很多木马,然后不小心执行了就完蛋了。
11. 如何验证主从mysql数据库是否成功?
答:show slave status
看这四个参数
12. 如何查看服务器内存使用情况?
答:free -h
13. 问老师如何用k8s来做
14. 如何保证数据安全?
答:从两方面,一方面保证是这个人发的(authentication),另外一方面数据是完整的(integrity),一般来说钥匙+sum验证码即可解决这个问题。
15. Shiro和JWT的区别是什么?
答:Shiro是基于session的,JWT是基于token的。
16. 京东的用户登陆方式是什么?
答:通过专门的passport.jd.com来实现登陆各个子系统,获取一个令牌,再从令牌拿一个token,这个token有过期机制或者登陆次数限定机制。这种方式叫做单点登陆。可以通过CAS+COOKIE或者OAUTH的方式来实现。
17. 网易云的数据库主从如何进行同步?
答:通过redis+kafka来进行同步binlog。kafka监听binlog日志,然后其他消费者通过监听kafka来进行同步。
18. Mysql & Elastic Search之间的数据如何同步?
答:也是可以通过logstash进行binlog同步。
19. 普通的架构是什么样的?
答:其中gateway和普通的终端之间还要用nginx做反向链接,但是图中并未标出。
架构
20. nginx/tomcat/gateway的并发量是什么样的?
答:一台nginx一般并发量可以达到10万,而一台tomcat或者gateway在500到800之间,所以如果要并发量达到10万,则需要一台nginx+20台左右的tomcat/gateway。
21. nginx应该如何配置?
答:upstream到前端,后端的转接到对应的api地址。
22. 入职新公司或者在某些项目上做二次开发第一步应该做什么?
答:了解这个项目的产品原型(即功能有哪些)。
23. Swagger是自动生成api文档的工具。api文档分两种,一种是doc版本的(适合银行/微信等api变动不大的企业),另外一种是在线api文档(适合迭代比较高的企业)。
24. 如何协调前后端合作?
答:可以使用rap2 api,前端mock数据,后端可以统一mock的格式,使得双方可以同时进行开发。这是带团队的方式。开源的,是java的,可以部署到自己企业。
25. swagger和rap2的区别是什么?
答:swagger需要后端部署了才可以访问,rap2不需要;swagger没有权限控制,不能对api进行分组。
26. docker-compose要在后台运行怎么弄?
答:-d 加上这个参数就可以了。
27. 作业:将druid换成HikariCP。
28. 作业:将docker换成k8s。答案
29. 可以使用graylog来展示log日志,比kibana专业。
30. 分布式事务用hmily tcc,还有了解sentinel如何操作进行限流。
31. 事务的特性为ACID(原子性,一致性,隔离性,持久性),其中隔离性会带来脏读,幻读和不可重复读。(需要自己去了解)http://www.txlcn.org/zh-cn/docs/preface.html
TCC需要人工干预32. 分布式事务包含哪几种解决方案?
- 最终一致性(tcc,分布式中间件的可靠消息)
- 强一致性
其中tcc的最终一致性要强一些,但是性能差一些,分布式中间件则是性能好,但是最终一致性弱一点。
33. 普通公司的并发量一般不超过1万。
34. 可以使用死信队列或者定时任务来让优惠券过期。
35. 定时调度框架包括xxl-job,elastic-job,quartz,TBschedule。
36. 网易云的并发量在2w+左右。
网易云37. Redis & Memcached的区别是什么?
答:Redis支持的数据结构较多,包括list/string等,但是Memcached只是key/value的系统。Memcached并发高多线程,Redis并发也高但是是单线程。
网易云
网易云
38. 同城多活,异地多活是什么意思?
39. 乐观锁如何在评论数据库中体现?
答:通过在comment里面设计version来实现。要解决行锁竞争,就需要异步的方式来解决。对于删除,网易云一般推荐逻辑删除,而不是物理删除。
乐观锁
网易云
网易云
网易云
网易云 网易云
40. 在网易云的comment id是怎么设计的?
答:自己实现的id,可以体现出对应的comment resource。
41. 如何保证点赞的有序性?
答:同一个资源的评论放到一个MQ partition,利用kafka某个一个queue能保证队内有序性来完成,但是也不能完全有序,例如前端使用了load balancer,发送过来的消息就不会完全有序;同时消费者端只是用单个消费者。
点赞
42. 缓存如何设计?
答:需要聚合的可以通过redis过2s过期的方式来做;但是只能有一个线程拿到分布式锁,其他人可以进行等待。
缓存
43. 最新评论如何设计?
答:不是通过page,而是通过time来做的分页。
最新评论
44. 如何通过前端来控制响应时间?
答:网易云评论是异步的,所以需要前端请求了api之后,api先判断是否可以是允许发表的评论,如果可以返回成功,前端立即显示,同时api再异步进行插入,自己能看到,但是别人看不到。
网易云
45. 如何解决行锁问题?
答:从客户端来说需要设置1s之后再集中更新,有个更新的频次。或者通过redis来做聚合,之后再更新到服务器。或者异步化。
46. 缓存集群还是应该通过一致性哈希的方式来运作,而不是取模,防止因为一个节点挂了,导致大面积缓存失效。
47. count的功能可能会使用另外新的数据表来解决。
48. 多级缓存数据不一致的情况如何解决?
答:提供纠错方案。例如redis过2s设置缓存失效。因为不一致的情况会一直存在,很难消除。或者订阅binlog,然后将消息丢入消息队列,来进行操作。
49. Docker中的ADD和COPY有什么区别?
答:ADD和COPY都可以将文件放到docker系统里,但是ADD还可以选择网址的文件进行下载,解压缩再放到docker系统里。
50. Docker中有几种启动程序的方式?
答:可以使用Entrypoint,这种方式比较单一;另外可以自己写脚本,然后CMD这个脚本运行。
51. Docker的Expose有什么意义?
答:使得程序默认使用这个端口号,免得k8s等随机生成端口号。
52. Spring Boot的Docker要如何更快启动?
答:可以将jar包手动解压缩,这样COPY进去之后就不用解压缩了。
解压缩
53. 如果jar包太大了,该怎么弄?
解决方案,挂一个共享盘54. 发布jar包的流程是什么?
答:要记得先docker login
流程
55. 私有的jar包应该用什么搭建?
答:docker版本的harbor。
56. docker compose里面的version应该如何制定?
答:先查看本地的docker版本和docker compose版本,然后根据版本才能知道支持的对应version是什么。
57. 如何删除docker compose被用户强制打断的container?
答:docker-compose -f ... rm
58. 如何能在A项目中使用B项目的名字而不是其ip地址进行访问?
答:用links这个关键字。
links
59. 一定要指定网络信息,不然会用默认的。服务最好都在同一个网络里面,这样可以调用。一般来说单机的docker使用的是bridge的network,而swarm集群使用的是overlay的network。
60. docker compose里面可以通过ENVIRONMENT来传入环境变量,使得nacos可以读取;docker run可以通过-d的方式传入环境变量。
61. 可以通过指定服务的docker CPU来限制服务的使用。这样就不用传入jvm参数来限制使用,因为先要在docker那一层去做限制。
限制62. 前端项目打包成静态文件由nginx来执行,最好不要用docker来打包镜像用npm来执行。【可以用jenkins来链接起来】
63.无状态的service扩容可以用docker-compose scale;有状态的例如端口指定的,是不能用docker-compose scale的。此时需要swarm或者k8s来操作。将docker compose文件copy到调度节点上,然后执行docker stack deploy。
64. docker swarm如何操作显示所有节点?
答:docker node list,docker stack list来显示部署的内容。
docker swarm
65. k8s如何查看资源是否空置?
答:kubectl get service / kubectl get pods / kubectl get deployments。
66. 通过ELK收集的日志需要如何才能通知到管理员?
答:将日志设置为提醒发送给Zabbix,然后就可以写脚本来发送短信/打电话给管理员。