SpringCloud框架学习总结
技术点:
1.Maven父子项目。
2.服务注册中心EurekaServer。
3.数据微服务注册
4.视图服务注册
5.微服务之间的彼此调用-----sleuth 服务链路追踪。
6.微服务间共享配置信息-----配置服务 Config Server。
7.配置客户端----productviewservicefeign
8.配置信息在多个微服务之间自动更新------RabbitMQ 总线 Bus。
9.数据微服务集群都不能使用了, 视图微服务处理方式------断路器 Hystrix。
10.断路器的开启与关闭时机------断路器监控Hystrix Dashboard。
11.集群聚合监控------断路器聚合监控 Turbine Hystrix Dashboard。
12.如何不暴露微服务名称,并提供服务------Zuul网关。
1.Maven父子项目的创建
在基础创建Maven项目的基础上
2.服务注册中心EurekaServer
EurekaServer服务本身是SpringBoot项目,该服务分为三个部分
1.pom.xml增加spring-cloud-starter-netflix-eureka-server jar包
2.EurekaServer启动类EurekaServerApplication.java
作为SpringBoot项目的启动类,EnrekaServer需要==@SpringBootApplication==。再者,它扮演的角色是注册中心,所以它需要==@EnableEurekaServer==
注:NetUtil.isUsableLocalPort(port)检查端口是否已经被占用
SpringApplication.run(Application.class, args);不涉及端口的启动SpringBoot项目
new SpringApplicationBuilder(EurekaServerApplication.class).properties(“server.port=” +
port).run(args); SpringBoot项目指定启动端口启动方式。
3.application.yml
EnrekaServer配置文件,提供 eureka 的相关信息
eureka.instance.hostname: localhost (主机名称为localhost)
eureka.client.registerWithEureka: false(是否注册到服务器。false表示不需要)
eureka.client.fetchRegistry: false (是否获取服务器的注册信息。false表示不需要)
eureka.client.serviceUrl.defaultZone: http://
e
u
r
e
k
a
.
i
n
s
t
a
n
c
e
.
h
o
s
t
n
a
m
e
:
{eureka.instance.hostname}:
eureka.instance.hostname:{server.port}/eureka/
(自己作为服务器,公布出来的地址。比如后续某个微服务要把自己注册到 eureka server, 那么就要使用这个地址: http://localhost:8761/eureka/)
spring.application.name: eureka-server(该微服务名称是 eureka-server )
注:http://127.0.0.1:8761/(该注册中心界面)
3.数据微服务注册
数据微服务为SpringBoot项目。该服务分为6个部分:
1.pom.xml
增加:
1.spring-cloud-starter-netflix-eureka-client 表示这是个 eureka 客户端。
2.spring-boot-starter-web: 表示这是个web服务,会提供控制层
2.实体类(基础类,不做介绍)
3.服务类
4.控制类
5.ProductDataServiceApplication启动类
-
注解:@SpringBootApplication
-
@EnableEurekaClient
new SpringApplicationBuilder(ProductDataServiceApplication.class).properties(" server.port=" + port).run(args);
注:NumberUtil.isInteger(strPort);判断strPort是否是数字
Convert.toInt(strPort);返回Future future
future.get(5,TimeUnit.SECONDS);返回int port,这里指的是端口号
6.application.yml
spring.application.name: product-data-service(该微服务名称是 product-data-service)
eureka.client.serviceUrl.defaultZone: http://localhost:8761/eureka/(设置注册中心地址,表示将该服务在EurekaServer中进行注册 )
4.视图服务注册
视图微服务为SpringBoot项目。由于视图服务需要访问数据服务。SpringCloud在这方面提供了Ribbon和Feign两种方式,( Feign 是对 Ribbon的封装,调用起来更简单)。
Ribbon方式
该服务分为7个部分:
1.pom.xml
spring-cloud-starter-netflix-eureka-client(eureka 客户端)
spring-boot-starter-web(springmvc)
spring-boot-starter-thymeleaf(thymeleaf 做服务端渲染)
2.实体类(基础类,不做介绍)
3. Ribbon 客户端
4.服务类
5. 控制器
6.启动类ProductViewServiceRibbonApplication
注解:
@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
(与ProductDataServiceApplication启动类相比较,ProductViewServiceRibbonApplication多了
注解多了个 @EnableDiscoveryClient, 表示用于发现eureka 注册中心的微服务。)
new SpringApplicationBuilder(ProductViewServiceRibbonApplication.class).properties("server.port=" + port).run(args);
@Bean
@LoadBalanced
RestTemplate restTemplate() {
return new RestTemplate();
}
@Bean:将该方法注册进spring容器
@LoadBalanced:注解是用来给RestTemplate做标记,以使用LoadBalancerClient来配置它
7.application.yml
指定了 eureka server 的地址,以及自己的名称。 另外是一些 thymeleaf 的默认配置。
eureka.client.serviceUrl.defaultZone: http://localhost:8761/eureka/
spring.application.name: product-view-service-ribbon
spring.thymeleaf.cache: false
spring.thymeleaf.cache: false
spring.thymeleaf.prefix: classpath:/templates/
spring.thymeleaf.suffix: .html
spring.thymeleaf.encoding: UTF-8
spring.thymeleaf.content-type: text/html
spring.thymeleaf.mode: HTML5
Feign方式
该服务分为7个部分:
1.pom.xml
spring-cloud-starter-netflix-eureka-client(eureka 客户端)
spring-cloud-starter-openfeign(服务间调用依赖)
spring-boot-starter-web(???)
spring-boot-starter-thymeleaf(thymeleaf 做服务端渲染)
2.实体类(基础类,不做介绍)
3.Feign客户端
通过注解方式 访问 访问product-data-service服务的 products路径, product-data-service 既不是域名也不是ip地址,而是 数据服务在 eureka 注册中心的名称。
4.服务类
5.控制器
6.启动类ProductViewServiceFeignApplication
注解:
@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
@EnableFeignClients(使用 Feign 方式)
new SpringApplicationBuilder(ProductViewServiceRibbonApplication.class).properties("server.port=" + port).run(args);
7.application.yml
eureka.client.serviceUrl.defaultZone: http://localhost:8761/eureka/
spring.application.name: product-view-service-feign
spring.thymeleaf.cache: false
spring.thymeleaf.prefix: classpath:/templates/
spring.thymeleaf.suffix: .html
spring.thymeleaf.encoding: UTF-8
spring.thymeleaf.content-type: text/html
spring.thymeleaf.mode: HTML5
5.微服务之间的彼此调用-----服务链路追踪。
该部分无需新建项目,只需启动链路追踪服务器,改进需要进行链路追踪的SpringBoot项目。这里需要进行链路追踪的项目是product-data-service和product-view-service-feign,只需要改进这两个项目即可
product-data-service
pom.xml
原:
1.spring-cloud-starter-netflix-eureka-client 表示这是个 eureka 客户端。
2.spring-boot-starter-web: 表示这是个web服务,会提供控制层
新增:
3.spring-cloud-starter-zipkin
application.yml
原:
spring.application.name: product-data-service(该微服务名称是 product-data-service)
eureka.client.serviceUrl.defaultZone: http://localhost:8761/eureka/(设置注册中心地址,表示将该服务在EurekaServer中进行注册 )
新增:
spring.zipkin.base-url: http://localhost:9411
启动类
启动类里配置 Sampler 抽样策略: ALWAYS_SAMPLE 表示持续抽样
``@Beanpublic Sampler defaultSampler() {
return Sampler.ALWAYS_SAMPLE;
}
product-view-service-feign
pom.xml
原:
1.spring-cloud-starter-netflix-eureka-client(eureka 客户端)
2.spring-cloud-starter-openfeign(服务间调用依赖)
3.spring-boot-starter-web(???)
4.spring-boot-starter-thymeleaf(thymeleaf 做服务端渲染)
新增:
5.spring-cloud-starter-zipkin
application.yml
原:
eureka.client.serviceUrl.defaultZone: http://localhost:8761/eureka/
spring.application.name: product-view-service-feign
spring.thymeleaf.cache: false
spring.thymeleaf.prefix: classpath:/templates/
spring.thymeleaf.suffix: .html
spring.thymeleaf.encoding: UTF-8
spring.thymeleaf.content-type: text/html
spring.thymeleaf.mode: HTML5
新增:
spring.zipkin.base-url: http://localhost:9411
启动类
启动类里配置 Sampler 抽样策略: ALWAYS_SAMPLE 表示持续抽样
``@Beanpublic Sampler defaultSampler() {
return Sampler.ALWAYS_SAMPLE;
}
6.微服务间共享配置信息-----配置服务 Config Server。
配置服务为SpringBoot项目。
1.pom.xml
spring-cloud-starter-netflix-eureka-client
spring-boot-starter-web
spring-cloud-config-server
2. 启动类ConfigServerApplication
注解:
@SpringBootApplication
@EnableConfigServer
@EnableDiscoveryClient
@EnableEurekaClient
new SpringApplicationBuilder(ConfigServerApplication.class).properties(“server.port=” + port).run(args);
3. application.yml
spring.application.name: config-server
spring.cloud.config.label: master
spring.cloud.config.server.git.uri: https://github.com/how2j/springcloudConfig/
spring.cloud.config.server.git.searchPaths: respo
eureka.client.serviceUrl.defaultZone: http://localhost:8761/eureka/
7.配置客户端----productviewservicefeign
在原来的productviewservicefeign基础上进行改进
1.pom.xml
1.spring-cloud-starter-netflix-eureka-client(eureka 客户端)
2.spring-cloud-starter-openfeign(服务间调用依赖)
3.spring-boot-starter-web(???)
4.spring-boot-starter-thymeleaf(thymeleaf 做服务端渲染)
5.spring-cloud-starter-zipkin
新增
6.spring-cloud-starter-config
###1. application.yml
原:
eureka.client.serviceUrl.defaultZone: http://localhost:8761/eureka/
spring.application.name: product-view-service-feign
spring.thymeleaf.cache: false
spring.thymeleaf.prefix: classpath:/templates/
spring.thymeleaf.suffix: .html
spring.thymeleaf.encoding: UTF-8
spring.thymeleaf.content-type: text/html
spring.thymeleaf.mode: HTML5
spring.zipkin.base-url: http://localhost:9411
现:
spring.application.name: product-view-service-feign
spring.thymeleaf.cache: false
spring.thymeleaf.prefix: classpath:/templates/
spring.thymeleaf.suffix: .html
spring.thymeleaf.encoding: UTF-8
spring.thymeleaf.content-type: text/html
spring.thymeleaf.mode: HTML5
spring.zipkin.base-url: http://localhost:9411
2.bootstrap.yml
spring.cloud.config.label: master
spring.cloud.config.profile: dev
spring.cloud.config.discovery.enabled: true
spring.cloud.config.discovery.serviceId: config-server
client.serviceUrl.defaultZone: http://localhost:8761/eureka/
3. ProductController控制类
8.配置信息在多个微服务之间自动更新------RabbitMQ 总线 Bus
在配置完成的客户端基础上进行改造,改造对象为product-view-service-feign做出的改进有。
1.pom.xml
1.spring-cloud-starter-netflix-eureka-client(eureka 客户端)
2.spring-cloud-starter-openfeign(服务间调用依赖)
3.spring-boot-starter-web(???)
4.spring-boot-starter-thymeleaf(thymeleaf 做服务端渲染)
5.spring-cloud-starter-zipkin
6.spring-cloud-starter-config
新增
7.spring-boot-starter-actuator 用于访问路径:/actuator/bus-refresh
8.spring-cloud-starter-bus-amqp 用于支持 rabbitmq
2.bootstrap.yml
spring.cloud.config.label: master
spring.cloud.config.profile: dev
spring.cloud.config.discovery.enabled: true
spring.cloud.config.discovery.serviceId: config-server
client.serviceUrl.defaultZone: http://localhost:8761/eureka/
新增:
spring.cloud.bus.enabled: true
spring.cloud.bus.trace. enabled: true
rabbitmq.host: localhost
rabbitmq.port: 5672
rabbitmq.username: guest
rabbitmq.password: guest
application.yml
原:
spring.application.name: product-view-service-feign
spring.thymeleaf.cache: false
spring.thymeleaf.prefix: classpath:/templates/
spring.thymeleaf.suffix: .html
spring.thymeleaf.encoding: UTF-8
spring.thymeleaf.content-type: text/html
spring.thymeleaf.mode: HTML5
spring.zipkin.base-url: http://localhost:9411
新增:
management.endpoints.web.exposure.include: “"
management.endpoints.web.cors.allowed-origins: "”
management.endpoints.web.cors.allowed-methods: “*”
3. 启动类 ProductDataServiceApplication==(product-date-service)== 新增rabbitMQ 端口检测。默认端口5672
4. FreshConfigUtil.java
5.启动 Zipkin
支持了 rabbitMQ, 那么在默认情况下,它的信息就不会进入 Zipkin
解决办法:
原启动方式:java -jar zipkin-server-2.10.1-exec.jar
现启动方式: java -jar zipkin-server-2.10.1-exec.jar --zipkin.collector.rabbitmq.addresses=localhost
9.数据微服务集群都不能使用了, 视图微服务处理方式------断路器 Hystrix。
改造的对象是视图服务: product-view-service-feign。
1.pom.xml
原:1.spring-cloud-starter-netflix-eureka-client(eureka 客户端)
2.spring-cloud-starter-openfeign(服务间调用依赖)
3.spring-boot-starter-web(???)
4.spring-boot-starter-thymeleaf(thymeleaf 做服务端渲染)
5.spring-cloud-starter-zipkin
6.spring-cloud-starter-config
7.spring-boot-starter-actuator 用于访问路径:/actuator/bus-refresh
8.spring-cloud-starter-bus-amqp 用于支持 rabbitmq
新增:
9.spring-cloud-starter-netflix-hystrix
2. ProductClientFeign
3.ProductClientFeignHystrix
4.application.yml
原:
spring.application.name: product-view-service-feign
spring.thymeleaf.cache: false
spring.thymeleaf.prefix: classpath:/templates/
spring.thymeleaf.suffix: .html
spring.thymeleaf.encoding: UTF-8
spring.thymeleaf.content-type: text/html
spring.thymeleaf.mode: HTML5
spring.zipkin.base-url: http://localhost:9411
management.endpoints.web.exposure.include: “"
management.endpoints.web.cors.allowed-origins: "”
management.endpoints.web.cors.allowed-methods: “*”
新增:
feign.hystrix.enabled: true(开启断路器)
10.断路器的开启与关闭时机------断路器监控Hystrix Dashboard。
创建 hystrix-dashboard子项目
1.pom.xml
spring-cloud-starter-netflix-eureka-client
spring-boot-starter-web
spring-boot-starter-actuator
spring-cloud-starter-netflix-hystrix
spring-cloud-starter-netflix-hystrix-dashboard
2.启动类ProductServiceHystrixDashboardApplication
3. application.yml
spring.application.name: hystrix-dashboard
4. ProductViewServiceFeignApplication
5.AccessViewService
11.集群聚合监控------断路器聚合监控 Turbine Hystrix Dashboard
创建turbine 项目
1.pom.xml
spring-cloud-starter-netflix-eureka-client
spring-boot-starter-web
spring-boot-starter-actuator
spring-cloud-starter-netflix-hystrix
spring-cloud-starter-netflix-hystrix-dashboard
spring-cloud-starter-netflix-turbine
2.ProductServiceTurbineApplication
3. application.yml
spring.application.name: turbine
security.basic.enabled: false
turbine.aggregator.clusterConfig: default
turbine.appConfig: product-view-service-feign ### 配置Eureka中的serviceId列表,表明监控哪些服务
turbine.clusterNameExpression: new String(“default”)
eureka.client.serviceUrl.defaultZone: http://localhost:8761/eureka/
4.AccessViewService
12.如何不暴露微服务名称,并提供服务------Zuul网关
创建zuul项目
1.pom.xml
spring-cloud-starter-netflix-eureka-client
spring-boot-starter-web
spring-cloud-starter-netflix-zuul
2.ProductServiceZuulApplication
3. application.yml
eureka.client.serviceUrl. defaultZone: http://localhost:8761/eureka/
spring.application.name: product-service-zuul
zuul.routes.api-a.path: /api-data/**
zuul.routes.api-a.serviceId: PRODUCT-DATA-SERVICE
zuul.routes.api-b.path: /api-view/**
zuul.routes.api-b.serviceId: PRODUCT-VIEW-SERVICE-FEIGN