# 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