# microservice-parent **Repository Path**: lddxfs/microservice-parent ## Basic Information - **Project Name**: microservice-parent - **Description**: springcloud搭建的项目 详见项目内容说明文件README.md - **Primary Language**: Java - **License**: BSD-3-Clause - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2018-11-13 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # springcloud示例 ## 一 说明 springcloud搭建的项目示例,本文为lddxfs原创,请注明出处 springcloud版本Edgware.SR5 springboot版本1.5.16.RELEASE jdk版本1.8 2020-09-02补充: gateway springboot 2.x apollo-use springboot 2.x ## 二 eureka集群 ##### discovery-eureka-ha项目VM参数 -Dspring.profiles.active=peer1 或peer2 或peer3 ![](./image/profile.PNG) ##### host文件增加 127.0.0.1 peer1.cn 127.0.0.1 peer2.cn 127.0.0.1 peer3.cn ##### 运行以下项目 1. discovery-eureka-ha 2. provider-demo ##### 运行效果 ![register-center-cluster](./image/register-center-cluster.png) ## 三 ribbon负载均衡 ##### 运行项目 1. discovery-eureka 2. consumer-demo-d9004 3. provider-demo(换一个端口启动) 4. provider-demo(换一个端口启动) ##### 注册中心 http://127.0.0.1:7000/ ![register-center](./image/register-center.png) ##### 消费方 http://127.0.0.1:9004/consumer/test 或 http://127.0.0.1:9004/swagger-ui.html#/consumer-controller/testUsingGET_7 ##### 提供方日志输出 ```wiki 2018-12-19 21:49:29.117 INFO 2384 --- [nio-8003-exec-1] l.s.p.controller.ProviderController : test :{testKey=3691c4c8-914f-4982-8b37-92eccd5c2d50} ``` ```wiki 2018-12-19 21:49:31.669 INFO 16816 --- [nio-8002-exec-1] l.s.p.controller.ProviderController : test :{testKey=33e69649-541b-4fea-9a14-157efc261019} ``` ## 四 feign 1. discovery-eureka 2. consumer-demo-d9004 3. provider-demo ##### 注册中心 http://127.0.0.1:7000/ ##### 测试连接 http://127.0.0.1:9004/swagger-ui.html#/ ![](./image/swagger-feign.PNG) ## 五 hystrix与ribbon结合使用,hystrix与feign结合使用 1. discovery-eureka 2. consumer-demo-d9004 3. provider-demo ##### 注册中心 http://127.0.0.1:7000/ ##### 测试连接 http://127.0.0.1:9004/swagger-ui.html#/ ![](./image/fallback01.PNG) 文件上传参考了博客: https://blog.csdn.net/weixin_43504713/article/details/83342647 https://www.jianshu.com/p/4f4d9d084b1d ## 六 hystrix dashbroad 1. discovery-eureka 2. hystrix-dashbroad-7030 3. consumer-demo-d9004 4. provider-demo ##### 注册中心 http://127.0.0.1:7000/ ##### 图 在 http://127.0.0.1:7030/hystrix 输入http://127.0.0.1:9104/hystrix.stream (项目consumer-demo-d9004配置了management.port=9104) ![](./image/dashbroad00.PNG) ##### 测试连接 http://127.0.0.1:9004/consumer/feign/test?param=777 http://127.0.0.1:9004/consumer/feign/testSleep?param=777 http://127.0.0.1:9004/swagger-ui.html#/consumer-controller/testSleepUsingGET_15 ![dashbroad](./image/dashbroad.PNG) ## 六 hystrix turbine 1. 1. discovery-eureka 2. hystrix-dashbroad-7030 3. hystrix-turbine-7040 4. consumer-demo-d9004 5. provider-demo 2. ​ consumer-demo-d9004开启另外一个服务,在Program argments 输入 --server.port=9005 --management.port=9105 ![](./image/consumer2.PNG) ##### 图 在http://127.0.0.1:7030/hystrix 输入http://127.0.0.1:7040/turbine.stream ![](./image/turbine01.PNG) ##### 测试链接 http://127.0.0.1:9004/consumer/feign/test?param=777 http://127.0.0.1:9004/consumer/feign/testSleep?param=777 http://127.0.0.1:9005/consumer/feign/test?param=777 http://127.0.0.1:9005/consumer/feign/testSleep?param=777 ![](./image/turbine02.PNG) ## 七 hystrix请求合并 1. discovery-eureka 2. consumer-demo-d9004 3. provider-demo #### 1 继承HystrixCollapser方式 ##### jmeter测试链接 http://127.0.0.1:9004/consumer/hystrix/command2?id=随机数【${__Random(1,6,)}】 ![jmeter](./image/jmeter.PNG) ##### 控制台输出 ```html 2018-12-20 22:48:35.783 INFO [consumer-demo,bedb651101e57446,bedb651101e57446,false] 10080 --- [hCommandGroup-6] l.s.consumer.command.BookBatchCommand : BookBatchCommand#run() ids:[2, 3, 4, 5] ``` #### 2 使用@HystrixCollapser注解方式 ##### jmeter测试链接 http://127.0.0.1:9004/consumer/hystrix/findOne?id=随机数【${__Random(-10,20,)}】 ##### jmeter测试文件 consumer-demo-d9004\请求合并findOne.jmx ![](./image/jmeter2.PNG) ##### 控制台输出 ```html l.s.consumer.service.BookServiceImpl : ids:[16, 3, -9, 12, -5, 9, 11, 11, -2, 10, 18, -9, -6, -1, -9, 15, 15, 7, 10, 0] ``` ##### 说明 从ids:[.....]可以看出,虽然请求已经合并,但是合并仍有重复的id,需要在本地或者远端服务做处理而避免重复查询 详见provider-demo项目的lddxfs.springcloud.provider.service.BookServiceImpl#batchSelectByPrimaryKeys 合并查询的返回结果list顺序与请求参数list顺序要保持一致、请求参数list个数与返回结果list个数需要保持一致 ```html Caused by: java.lang.RuntimeException: Failed to map all collapsed requests to response. The expected contract has not been respected. Collapser key: 'findOne', requests size: '20', response size: '8' ``` #### 3 使用对象作为查询条件的请求合并 ##### jmeter测试文件 consumer-demo-d9004\多参数_请求合并queryByBookQuery.jmx consumer-demo-d9004\多参数_请求合并queryByBookQuerySuggest.jmx ![](./image/jmeter3.PNG) ##### 控制台输出 ```html l.s.provider.service.BookServiceImpl : ====>执行数据库查询 方法参数个数:3 合并后mapper参数个数:1,数据库返回books个数:13 ``` ```sql ==> Preparing: select id, name, author1, author2, author3, price, create_date, update_date , ? as paramIndex, ? as paramUuid from tb_book WHERE (author1=? or author2=? or author3=?) UNION ALL select id, name, author1, author2, author3, price, create_date, update_date , ? as paramIndex, ? as paramUuid from tb_book WHERE (author1=? or author2=? or author3=?) UNION ALL ...... ``` ##### 说明 详见provider-demo项目的lddxfs.springcloud.provider.service.BookServiceImpl#batchQueryByBookQuery lddxfs.springcloud.provider.service.BookServiceImpl#batchQueryByBookQuerySuggest ```java /** * hystrix 请求合并 多参数批量查询 使用set集合过滤相同条件 * * @param bookQueryList * @return */ @Override public List> batchQueryByBookQuerySuggest(List bookQueryList) { //使用set集合过滤相同条件 ,需要重写equal方法 Set bookQuerySet = new LinkedHashSet<>(bookQueryList.size()); bookQuerySet.addAll(bookQueryList); List books = bookMapper.queryByBookQuerys(bookQuerySet); logger.info("执行数据库查询 方法参数:{} 合并后mapper参数:{},数据库返回books{}",bookQueryList, bookQuerySet, JSON.toJSONString(books)); logger.info("====>执行数据库查询 方法参数个数:{} 合并后mapper参数个数:{},数据库返回books个数:{}",bookQueryList.size(), bookQuerySet.size(), books.size()); Map> tempMap = new HashMap<>(bookQuerySet.size()); Iterator it = bookQuerySet.iterator(); while (it.hasNext()) { tempMap.put(it.next().getParamUuid(), new LinkedList<>()); } for (Book book : books) { tempMap.get(book.getParamUuid()).add(book); } List> resultList = new LinkedList<>(); for (BookQuery bookQuery : bookQueryList) { if (tempMap.containsKey(bookQuery.getParamUuid())) { logger.info("匹配到查询条件 paramUuid:{}",bookQuery.getParamUuid()); resultList.add(tempMap.get(bookQuery.getParamUuid())); } else { resultList.add(Collections.emptyList()); } } logger.info("返回结果集:{}",JSON.toJSONString(resultList, SerializerFeature.DisableCircularReferenceDetect)); return resultList; } ``` ## 八 集中配置(配置中心 ,配置客户端) ##### 运行 启动其他依赖服务,再启动以下服务 config-server (使用use-files目录配置) consumer-demo-d9004(使用use-files目录配置) ##### 查看配置值 http://127.0.0.1:9004/swagger-ui.html#/config-demo-controller/getProfileUsingGET ##### 单机配置刷新 使用postman执行单机配置刷新 ![](./image/config_refresh.PNG) ##### 配置加密 解密 加密 http://127.0.0.1:7050/encrypt 解密 http://127.0.0.1:7050/decrypt ![](./image/config_encrypt.PNG) ##### 配置中心配置方式 本地文件 ,git ,eureka+git 请参考config-server项目。黄色圈起来的文件夹存放配置文件,需要按文件夹名称对应使用 ![](./image/config_server.PNG) ##### 集群配置刷新 启动其他依赖服务,再启动以下服务 config-server (使用bus-refresh-mq目录配置, 需要上传配置到git) consumer-demo-d9004(使用bus-refresh-mq目录配置) postman文件(springcloud.postman_collection.json) ![](./image/config_refresh_postmen.PNG) ## 九 分布式服务跟踪(spring-cloud-starter-sleuth) ### ~~zipkin Server jar方式运行(old)~~ 参考(https://segmentfault.com/a/1190000012342007) ``` wget -O zipkin.jar 'https://search.maven.org/remote_content?g=io.zipkin.java&a=zipkin-server&v=LATEST&c=exec' nohup java -jar zipkin.jar & tail -f nohup.out ``` ### springboot项目方式开启zipkin Server ##### 运行 其他项目 discovery-eureka config-server(配置文件目录use-files) consumer-demo-d9004(配置文件目录use-files) provider-demo zipkin-server-mysql-storage (zipkin Server使用mysql存储) ##### 测试 打开 http://127.0.0.1:9004/swagger-ui.html#/ 选择一个方法执行 例如 http://127.0.0.1:9004/consumer/testSleep ##### 运行效果 ![](./image/zipkin2.PNG) ![zipken-mysql](./image/zipken-mysql.PNG) ### zipkin 使用rabbitmq收集 discovery-eureka zipkin-server-mysql-storage-mq-collect config-server(配置文件目录use-files-zipkin-mq-collect) consumer-demo-d9004(配置文件目录use-files-zipkin-mq-collect) provider-demo 或 discovery-eureka zipkin-server-mysql-storage-mq-collect config-server(配置文件目录bus-refresh-mq) consumer-demo-d9004(配置文件目录bus-refresh-mq) provider-demo ![](./image/zipken-rabbitmq.PNG) ![](./image/zipken-rabbitmq2.PNG) ## 十 springboot-admin ![springboot-admin1](./image/springboot-admin1.PNG) ![springboot-admin](./image/springboot-admin.PNG) ##### springboot admin ,turbine ,登录ui ![](./image/springboot-admin-turbine.PNG)