# lzmh_spring_cloud_study **Repository Path**: likejian/lzmh_spring_cloud_study ## Basic Information - **Project Name**: lzmh_spring_cloud_study - **Description**: 联掌门户 Spring Cloud 学习 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2017-07-08 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README L01、Spring Boot 入门 =================================== 1、开发工具Spring Tool Suit 2、结合《Spring+Cloud微服务实战.pdf》第二章 3、快速构建Spring Boot微服务 实现RESTfull,项目《01_spring_boot》 (1)项目结构 (2)配置文件:application.properties 与 application.yml 4、如何运行 (1)Spring Boot App (2)使用mvn install 将应用打包成jar包,再通过java -jar xxx.jar 来启动应用 5、监控管理与actuator (1)修改pom.xml 引入actuator依赖 (2)记得配置文件关闭安全认证 management.security.enabled=false (3)原生端点(EndPoint) 初步认识 可以结合Spring Cloud Admin 界面 应用配置类:beans/env/info/mappings 度量指标类:metrics/health/dump/trace 操作控制类:loggers/heapdump 6、 L02、 服务注册与发现 =================================== 什么是服务注册、什么是服务发现? http://blog.didispace.com/springcloud1/ ----------------------------------- Eureka服务注册 项目《02_spring_eureka_server》 1、修改pom.xml,加入 org.springframework.cloud spring-cloud-starter-eureka-server 2、修改application.properties #是否将Eureka自身作为应用注册到Eureka注册中心 eureka.client.register-with-eureka=false #是否从Eureka Server获取注册信息 eureka.client.fetch-registry=false eureka.client.service-url.defaultZone=http://lzmh:lzmh123@localhost:6002/eureka 3、修改应用程序主类,加入如下注解 @EnableEurekaServer 4、加入security进行安全验证 (1)修改pom.xml,加入 org.springframework.boot spring-boot-starter-security (2)修改application.properties security.basic.enabled=true security.user.name=lzmh security.user.password=lzmh123 5、 ----------------------------------- Eureka服务发现(客户端、服务提供者) 项目《03_spring_eureka_client》 1、修改application.properties, 把服务注册到Eureka eureka.client.service-url.defaultZone=http://lzmh:lzmh123@localhost:6002/eureka eureka.instance.prefer-ip-address=true eureka.instance.instance-id=${spring.application.name}:${spring.cloud.client.ipAddress}:${spring.application.instance_id:${ server.port}} 2、修改应用程序主类,加入如下注解 @EnableEurekaClient L03、 服务消费 =================================== Ribbon-客户端负载均衡 1、什么是客户端负载均衡 2、有哪些负载均衡算法 随机(Random) 轮询(RoundRobin) 哈希(Hash) 一致性哈希(ConsistentHash) 加权(Weighted) 3、Ribbon提供哪些负载均衡策略 http://blog.csdn.net/rickiyeat/article/details/64918756 http://www.importnew.com/23515.html 4、Ribbon 负载均衡的实现及默认负载均衡策略 入口类:restTemplate加上注解@LoadBalanced 默认负载均衡策略RoundRobin 5、自定义配置Ribbon的负载均衡策略 (1)代码 入口类: @RibbonClient(name="03-spring-eureka-client", configuration=MyRibbonConfiguration.class) 实现类: MyRibbonConfiguration 注意:这个类不在在入口类的目录或者其子目录下 (2)配置文件 .ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule 6、Ribbon without Eureka ribbon.eureka.enabled=false .ribbon.listOfServers=localhost:7900,localhost:7901,localhost:7902 Feign-声明式REST客户端 1、什么是声明式客户端,我们之前是怎么调用HTTP服务的 2、什么是Feign,Feign 整合了Ribbon和Eureka来提供负载均衡的HTTP客户端 3、Feign的实现 (1)修改pom.xml,加入feigin的依赖 org.springframework.cloud spring-cloud-starter-feign (2)启动类加上注解:@EnableFeignClients (3)新增接口 CalcFeignClient (4)修改CalcControl.java 使用CalcFeignClient进行改造 (5)也自定义Ribbon的负载均衡策略 L04、 断路器 =================================== Hystrix 1、参考:http://blog.didispace.com/springcloud3/ 2、Ribbon with Hystrix (1)pom.xml加入hystrix的依赖 org.springframework.cloud spring-cloud-starter-hystrix (2)入口类加上注解 @EnableCircuitBreaker (3)修改CalcControl add请求方法上加上:@HystrixCommand(fallbackMethod = "addFallback") 新增实现方法:addFallback (4)关掉 03-spring-eureka-client 观察:http://192.168.10.213:6060/health 断路器的开关状态 3、Feign whti Hystrix (1)pom.xml加入hystrix的依赖 org.springframework.cloud spring-cloud-starter-hystrix (2)入口类加上注解 @EnableCircuitBreaker (3)修改 CalcFeignClient,在类上加上如下注解 @FeignClient(name="03-spring-eureka-client", fallback = CalcFeignClientFallback.class) (4)新增类CalcFeignClientFallback 并实现接口CalcFeignClient (5)加入如下配置,这个配置默认值是false,但是我之前没加是ok的,奇怪了 feign.hystrix.enabled=true 参考:http://www.cnblogs.com/devzxd/p/feign-hystrix-problem.html (6)关掉 03-spring-eureka-client 观察:http://192.168.10.213:6070/health 断路器的开关状态 4、为Feign配置请求重试 (1)参考:http://blog.didispace.com/spring-cloud-ribbon-failed-retry/ (2)修改application.properties ##请求连接的超时时间 03-spring-eureka-client.ribbon.ConnectTimeout=500 ##请求处理的超时时间 03-spring-eureka-client.ribbon.ReadTimeout=2000 ##对所有操作请求都进行重试 03-spring-eureka-client.ribbon.OkToRetryOnAllOperations=true ##切换实例的重试次数 03-spring-eureka-client.ribbon.MaxAutoRetriesNextServer=2 ##对当前实例的重试次数 03-spring-eureka-client.ribbon.MaxAutoRetries=1 ##断路器的超时时间(断路器的超时时间需要大于ribbon的超时时间,不然不会触发重试) hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=10000 (3)验证 前提: 1、同一个ServiceId有A、B 两个服务 2、假定每次都超时 —————————————————————————————————————————————————————————————————————— #####A ##切换实例的重试次数 03-spring-eureka-client.ribbon.MaxAutoRetriesNextServer=0 ##对当前实例的重试次数 03-spring-eureka-client.ribbon.MaxAutoRetries=0 —————————————————————————————————————————————————————————————————————— #####AA ##切换实例的重试次数 03-spring-eureka-client.ribbon.MaxAutoRetriesNextServer=0 ##对当前实例的重试次数 03-spring-eureka-client.ribbon.MaxAutoRetries=1 —————————————————————————————————————————————————————————————————————— #####AAA ##切换实例的重试次数 03-spring-eureka-client.ribbon.MaxAutoRetriesNextServer=0 ##对当前实例的重试次数 03-spring-eureka-client.ribbon.MaxAutoRetries=2 —————————————————————————————————————————————————————————————————————— #####AB ##切换实例的重试次数 03-spring-eureka-client.ribbon.MaxAutoRetriesNextServer=1 ##对当前实例的重试次数 03-spring-eureka-client.ribbon.MaxAutoRetries=0 —————————————————————————————————————————————————————————————————————— #####AABB ##切换实例的重试次数 03-spring-eureka-client.ribbon.MaxAutoRetriesNextServer=1 ##对当前实例的重试次数 03-spring-eureka-client.ribbon.MaxAutoRetries=1 —————————————————————————————————————————————————————————————————————— #####AAABB ##切换实例的重试次数 03-spring-eureka-client.ribbon.MaxAutoRetriesNextServer=1 ##对当前实例的重试次数 03-spring-eureka-client.ribbon.MaxAutoRetries=2 —————————————————————————————————————————————————————————————————————— Hystrix-dashboard (1)参考:http://www.cnblogs.com/java-zhao/p/5813439.html (2)pom.xml加入hystrix-dashboard的依赖 org.springframework.cloud spring-cloud-starter-hystrix-dashboard (3)入口类加上注解 @EnableHystrixDashboard (4)访问 http://localhost:6080/hystrix 配置URL:http://192.168.10.213:6060/hystrix.stream (5)关掉 03-spring-eureka-client 通过dashboard观察断路器的开关状态 Hystrix-turbine (1)参考:http://blog.csdn.net/liaokailin/article/details/51344281 (2)pom.xml加入hystrix-turbine的依赖 org.springframework.cloud spring-cloud-starter-turbine (3)入口类加上注解 @EnableTurbine (4)访问 http://localhost:6080/hystrix 配置URL:http://192.168.10.213:6090/turbine.stream (5)关掉 03-spring-eureka-client 通过dashboard观察断路器的开关状态 L05、 服务网关(API网关) =================================== 1、参考 http://blog.didispace.com/springcloud5/ 2、什么是网关,网关应该具有什么功能 (1)路由、负载均衡 (2)安全、权限控制 (3)限流 (4)监控 3、Zuul (1)pom.xml加入zuul的依赖 org.springframework.cloud spring-cloud-starter-zuul (2)入口类加上注解 @EnableZuulProxy (3)服务路由的几种方式 A、通过url直接映射(此种方式不需要依赖Eureka) zuul.routes.lzmh_user_api.path=/lzmh_user_api/** zuul.routes.lzmh_user_api.url=http://localhost:2222/ B、通过ServiceId映射(推荐这种方式,底层使用了Hystrix支持断路器) 方式一: zuul.routes.lzmh_user_api.path=/lzmh_user_api/** zuul.routes.lzmh_user_api.serviceId=lzmh_user_api 方式二: zuul.routes.= demo: zuul.routes.03-spring-eureka-client=/03_spring_eureka_client/** C、设置不被路由 zuul.ignored-patterns=/**/hello/** (4)过滤器 参考:http://blog.didispace.com/spring-cloud-source-zuul/ A、过滤器类型 pre/route/post/error B、HTTP请求生命周期 C、过滤器执行顺序 D、自定义过滤器 E、禁用原生的过滤器 F、源码及版本差异 SendErrorFilter、SendResponseFilter等 (5)失败重试 L06、 服务跟踪 =================================== Sleuth+Zipkin http://www.cnblogs.com/shunyang/p/7011283.html 1、Sleuth (1)修改原来的工程03_spring_eureka_client和07_spring_feign_with_hystrix pom.xml加入sleuth依赖 org.springframework.cloud spring-cloud-starter-sleuth (2)发起一次http请求并观察日志打印 03_spring_eureka_client: 2017-09-04 14:04:48.599 INFO [03-spring-eureka-client,696d65c15e2b6f82,26063bf21ac5f213,false] 1584256 --- [nio-6031-exec-1] c.l.s.c.e.client.control.CalcControl : ==into add==curretnTime=1504505088599 sleepTime=0 07_spring_feign_with_hystrix 2017-09-04 14:04:48.346 INFO [07-spring-feign-with-hystrix,696d65c15e2b6f82,696d65c15e2b6f82,false] 1608136 --- [nio-6070-exec-6] c.l.s.cloud.feign.control.CalcControl : ====03-spring-eureka-client:192.168.10.213:6031 (3)通过以上2个步奏,简单的调用链就建立起来了 (4)基本概念 Trace Span 2、zipkin (1)搭建zipkin server端 新建项目11_spring_zipkin 加入依赖 io.zipkin.java zipkin-server io.zipkin.java zipkin-autoconfigure-ui 启动类加入@EnableZipkinServer注解 (2)浏览器访问http://192.168.10.213:9000/ (3)修改原来的工程03_spring_eureka_client和07_spring_feign_with_hystrix pom.xml加入sleuth依赖 org.springframework.cloud spring-cloud-sleuth-zipkin 修改application.properties,加入如下配置 ##服务调用个跟踪 spring.zipkin.enabled=true spring.zipkin.base-url=http://localhost:9000 ##采样率,默认值0.1 spring.sleuth.sampler.percentage=1 (4)以上方式存在什么问题呢? 重启11_spring_zipkin后,数据将会丢失 zipkin-client到 zipkin-server的请求是http,有存在性能损失 (5)引入mysql、rabbitmq、elasticsearch进行改造 数据持久化到mysql 通信方式改为socket 数据持久化到elasticsearch 3、dashboard https://springcloud.cc/spring-cloud-dalston.html#_spring_cloud_sleuth L07、 服务监控管理 =================================== Spring Boot Admin 参考:http://codecentric.github.io/spring-boot-admin/1.5.2/ 1、Spring Boot Admin Server pom.xml de.codecentric spring-boot-admin-server 1.5.2 de.codecentric spring-boot-admin-server-ui 1.5.2 入口类: @Configuration @EnableAutoConfiguration @EnableAdminServer 2、Spring Boot Admin Client(客户端实现) pom.xml de.codecentric spring-boot-admin-starter-client 1.5.2 application.properties spring.boot.admin.url=http://localhost:8080 3、结合Erueka(服务端实现) pom.xml org.springframework.cloud spring-cloud-starter-eureka 入口类: @Configuration @EnableAutoConfiguration @EnableDiscoveryClient @EnableAdminServer application.properties eureka.client.service-url.defaultZone=http://lzmh:lzmh123@localhost:6002/eureka eureka.client.registry-fetch-interval-seconds=5 eureka.instance.lease-expiration-duration-in-seconds=10 eureka.instance.prefer-ip-address=true eureka.instance.instance-id=${spring.application.name}:${spring.cloud.client.ipAddress}:${spring.application.instance_id:${server.port}} 4、邮件告警通知 pom.xml org.springframework.boot spring-boot-starter-mail application.properties spring.mail.host=smtp.139.com spring.mail.port=25 spring.mail.username=13616052510@139.com spring.mail.password=like110120 spring.boot.admin.notify.mail.from=13616052510@139.com spring.boot.admin.notify.mail.to=13616052510@139.com spring.boot.admin.notify.mail.subject="#{to.status} #{application.name} (#{application.id})" 5、Hystrix UI Module pom.xml de.codecentric spring-boot-admin-server-ui-hystrix 1.5.2 application.properties spring.boot.admin.routes.endpoints=env,metrics,dump,jolokia,info,configprops,trace,logfile,refresh,flyway,liquibase,heapdump,loggers,auditevents,hystrix.stream 6、Turbine UI Module pom.xml de.codecentric spring-boot-admin-server-ui-turbine 1.5.2 application.properties ##turbine 配置 spring.boot.admin.turbine.clusters=default ##turbine的服务名称 spring.boot.admin.turbine.location=09-spring-hystrix-turbine 7、Login UI Module pom.xml de.codecentric spring-boot-admin-server-ui-login 1.5.2 8、Security 安全登录认证 pom.xml org.springframework.boot spring-boot-starter-security application.properties security.basic.enabled=true security.user.name=lzmh security.user.password=lzmh123 安全验证配置类 @Configuration public static class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.formLogin().loginPage("/login.html").loginProcessingUrl("/login").permitAll(); http.logout().logoutUrl("/logout"); http.csrf().disable(); http.authorizeRequests().antMatchers("/login.html", "/**/*.css", "/img/**", "/third-party/**").permitAll(); http.authorizeRequests().antMatchers("/**").authenticated(); http.httpBasic(); } } 9、界面模块 (1)Details (2)Metrics 指标、度量值 (3)Environment 可动态设置application.properties配置的内容 (4)Logging 可动态设置logback的日志级别 (5)Threads 线程情况的可视化 (6)Audit (7)Trace (8)Heapdump (9)Hystrix L08、 swagger2 =================================== 参考:https://my.oschina.net/u/2278977/blog/816052 结合项目:lzmh_microservice_weixin_applet_api