安装springide在eclipse上打开eclipse ide,help->install new software..
2.输入updatesite http://springide.org/updatesite
3.这时会出现很多关于spring的插件,选择如下勾选
Core/Spring IDE
Extensions/SpringIDE
Resources/SpringIDE
4.按提示重启eclipse
-
创建maven项目
-
Pom文件中添加springBoot的父级依赖
<parent>
-
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.0M1</version>
<relativePath/>
</parent>
在dependencies添加Web支持的starter pom 添加web依赖
<dependency>
<groupId> org.springframework.boot </groupId>
<artifactId> spring-boot-starter-web </artifactId>
</dependency>
-
新建控制器类
类上注解:
@SpringBootApplication
是springBoot项目的核心注解,主要目的是开启自动配置,
SpringBoot内置tomcat,直接运行控制器类中的main方法就可以直接浏览器访问
3、springBoot的配置文件
SpringBoot使用一个全局的配置文件application.properties或者application.yml,放入resources文件夹下
application.properties:
server.port=8080:可以修改内置tomcat默认端口
server.context-path=/hello :修改访问路径
application.yml 不允许使用tab键
server:
port:8080
contextPath:/hello
使用xml配置:
springBoot提倡零配置,即无xml配置,实际项目中可能有一些必须使用xml配置,可以通过spring提供的@ImportResource来加载xml
:@ImportResource({"classpath:文件名","classpath:文件名"})
SpringBoot可以是基于jar包运行的,打成jar命令:
Java –jar xx.jar
可以通过以下命令修改tomcat端口号
Java –jar xx.jar –server.port=8081
Spring Cloud
服务发现:
Spring Cloud 通过Netflix OSS的Eureka来实现服务发现,服务发现的主要目的是为了让每个服务之间可以互相通信。Eureka Server为微服务注册中心
Spring Cloud使用注解的方式提供了Eureka服务端(@EnableEurekaServer)和客户端(@EnableEurekaClient)
路由网关:
路由网关的主要目的是为了让所有的微服务对外只有一个借口,我们只需访问一个网关地址,即可由网关将我们的请求代理到不同的服务中
Spring Cloud 是通过Zuul来实现的,支持自动路由映射到在Eureka Server 上注册的服务。Spring Cloud 提供了注解@EnableZuulProxy来启用路由代理。
负载均衡:
Spring Cloud提供了Ribbon和Feign作为客户端的负载均衡,在Spring Cloud下,使用Ribbon直接注入一个RestTemplate对象即可,此RestTemplate已做好负载均衡的配置;而使用Feign只需定义个注解,有@FeignClient注解的借口,然后使用@RequestMapping注解在方法上映射远程的Rest服务,此方法也是做好负载均衡配置的。
断路器:
断路器(Circuit Breaker) 主要是为了解决当某个方法调用失败的时候,调用后备方法来替代失败的方法,已达到容错,阻止级联错误等功能。
Spring Cloud使用EnableCircuitBreaker来启用断路器支持,使用@H也是听日先Command的fallBackMethod来制定后备方法。
Spring Cloud还给我们提供了一个控制台来监控断路器的运行情况,通过@EnableHystrixDashborad注解开启。
Eureka server
Eureka来自生产环境
Eureka是NetFlix开发的服务发现框架,本身是一个基于rest的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。springCloud将它集成在其子项目spring-cloud-netflix中,以实现springcloud的服务发现功能
springCloud对Eureka的支持很好
Eureka原理:
Eureka server提供服务注册器,各个节点启动后会在Eureka server中进行注册,这样Eureka server中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到
Eureka client 是一个Java的客户端,用于简化与Eureka server的交互,客户端同时也具备一个内置的、使用轮询(round-robin)负载算法的负载均衡器。
在应用启动后,将会向Eureka server发送心跳(默认周期30秒)。如果Eureka server在多个心跳周期内没有接收到某个节点的心跳,Eureka server将会从服务注册表中把这个服务节点移除(默认90秒)。
Eureka server之间将会通过服务制的方式完成数据的同步
Eureka还提供了客户端缓存的机制,即使所有的Eureka server都挂掉,客户端依然可以利用缓存中的信息消费其他服务的API。
综上,Eureka通过心跳检测、健康检查、客户端缓存等机制,确保了系统的高可用性、灵活性和可伸缩性,
配置 Eureka server
register-with-eureka:false :只作为服务端,不作为客户端
fetch-registry:false
1、创建服务注册中心:
Eureka Server为微服务注册中心 每一个服务方就是消费方
pom.xml引入依赖
、
入口主函数内注解
创建properties配置文件
访问地址:peer:2222
2、创建服务提供方:
在服务中心注册
Pom.xml需引入
入口主函数:
配置文件properties
Spring.application.name:该服务的名字,调用该服务的时候直接调用名字就行
3、服务消费方:
在服务中心注册 每一个服务提供方就是消费方
SpringCloud Ribbon:客户端负载均衡
基于http和tcp的客户端负载均衡工具 基于Netflix Ribbon实现
Eureka已经集合了ribbon功能
负载均衡策略:轮询 随机。。
@loadBalanced 使用ribbon注解
Restemplate直接注入就可以使用负载
默认负载均衡策略是轮询访问
1、创建ribbon应用
-
Pom.xml需引入
入口主函数:
该项目的properties文件
#开启重试机制
spring.cloud.loadbalancer.retry.enabled=true
#断路器的超时时间需要大于ribbon的超时时间,不然不会触发重试毫秒
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=10000
#请求连接超时时间服务名一定要和feign中使用的服务名相同
test-server.ribbon.ConnectTimeout=100
#请求处理的超时时间
test-server.ribbon.ReadTimeout=500
#对所有操作请求都进行重试
test-server.ribbon.OkToRetryOnAllOperations=true
#切换实例的重试次数
test-server.ribbon.MaxAutoRetriesNextServer=2
#对当前实例的重试次数
test-server.ribbon.MaxAutoRetries=1
消费方使用ribbon实现负载均衡,并调用服务提供方
Spring cloud Hystrix:服务容错保护
-
添加依赖
在ribbon应用pom文件中引入hystrix的依赖
-
添加注解
在主类上添加注解@EnableCircuitBreaker断路器注解
-
服务容错
创建实现服务容错的类 同步执行容错:
-
缓存
缓存的几中方式:
注解 |
描述 |
属性 |
@CacheResult |
该注解用来标记请求命令返回的结果应该被缓存,它必须与@HystrixCommand注解结合使用 |
cacheKeyMethod(用来指定具体的生成函数) |
@CacheRemove |
该注解用来染请求命令的缓存失效,失效的缓存根据定义的key决定 |
commandKey(必须指定,用来指定哪个方法使用了缓存) cacheKeyMethod |
@CacheKey |
该注解用来在请求命令的参数上标记,使其作为缓存的key值,如果没有标注则会使用所有参数。如果同时还使用了@CacheResult和@CacheRemove注解的CacheKeyMethod方法指定缓存key的生成,那么该注解将不会起作用 |
Value(@Cachekey("id")) |
5、请求合并
合并处理器:
@HystrixCollapser实现了在@HystrixCommand之前放置一个合并处理器,将处于一个很短的时间窗(默认10毫秒)内对同一依赖服务的多个请求进行整合并以批处理方式发起请求的功能(服务提供方也需要提供相应的批量实现接口)。
请求合并器使多个单个请求统一起来后向批量方法中查询,每单个请求都会占用一个线程,经过请求合并后有效较少了对线程池中资源的占用。所以在资源有效并且短时间内会产生高并发请求的时候,为避免连接不够用而引起的延迟可以考虑使用请求合并器的方式来处理和优化。
batchMethod:指定批量请求的实现方法
collapserProperties:设置请求器的相关属性
@HystrixProperty(name="timeDelayInMilliseconds", value = "100")为合并时间窗设置为100毫秒
6、Hystrix仪表盘
用来实时监控Hystrix的各项指标信息,整合Turbine来实时对集群的监控。
Turbine集群监控:
在ribbon项目中的Pom文件中引入spring-boot-starter-actuator依赖
在应用主类中添加//断路器@EnableCircuitBreaker注解。
新建turbine项目并引入:
配置文件:
应用主类:
新建Hystrix- Dashboard项目:pom文件引入:
配置文件:
应用主类:
访问Hystrix- Dashboard项目,http://localhost:3333/hystrix会出现以下
在输入框中输入turbine的流:http://localhost:4444/turbine.stream出现:
Spring Cloud feign:声明式服务调用
基于Netflix Feign实现,整合了spring cloud ribbon 与spring cloud Hystrix ,除了提供者两者的强大功能之外,它还提供了一种声明式的web服务客户端定义方式。以接口的形式调用其他服务
Feign应用的创建及使用
创建springboot maven工程,pom文件引入
创建主类:
创建调用Feign客户端接口
再创建Feign接口时使用@FeignClient注解。在初始化过程中Spring Cloud Feign 会根据注解的name属性或value属性指定的服务名,自动创建一个同名的Ribbon客户端。
创建controller 来实现对Feign客户端的调用
启动主类调用测试方法http://localhost:1234/feign/test
重试机制:
服务降级:
在Feign中实现服务降级时只需要为Feign客户端定义的接口编写一个具体的接口实现类。
只需要在接口上使用注解指向这个实现类就可以使用服务降级。
Spring Cloud Config :分布式服务配置中心
在分布式系统中,由于服务众多,为了方便服务配置文件统一管理,实时更新,所以需要分布式配置中心组件。在Spring Cloud中,有分布式配置中心组件spring cloud config ,它支持配置服务放在配置服务的内存中(即本地),也支持放在远程Git仓库中。在spring cloud config 组件中,分两个角色,一是config server,二是config client。
1、config server
1、创建应用
Pom.xml文件中引入
2、创建主类
SpringBoot的程序主类,并添加EnableConfigServer注解,开启Spring Cloud Config的服务端功能
3、创建配置文件 :以Git做文件系统支持
创建配置文件:git做配置
spring.cloud.config.server.git.search-paths=config-repo/
# 指定搜索路径,如果有多个路径则使用,分隔
spring.cloud.config.server.git.basedir=/tmp/config-repo
# 对于使用git,svn做为后端配置,从远程库获取配置文件,需要存储到本地文件
spring.cloud.config.server.git.force-pull=true
# 配置中心通过git从远程git库,有时本地的拷贝被污染,这时配置中心无法从远程库更新本地配置,设置force-pull=true,则强制从远程库中更新本地库
创建配置文件
在git中的config-repo文件夹中创建名为:
conf-test.properties,conf-dev.properties,conf-prod.properties三个文件。
内容分别为;from=test from=dev from=prod
在浏览器中输入如下URL,可以访问到配置文件
/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties
下面通过具体例子说明以上url的意思。如果我们的配置文件名称conf-test.properties,则其和URL中各个字段对应的值为:
application: conf
profile: test
label: 0ce006905056151d81f64eab1c47e412542380a4
我们访问以下地址都可以访问到配置文件config-test.properties和特定版本下此文件:
http://localhost:7001/conf/test/
http://localhost:7001/conf/test/0ce006905056151d81f64eab1c47e412542380a4
http://localhost:7001/conf-test.properties
http://localhost:7001/0ce006905056151d81f64eab1c47e412542380a4/conf-test.properties
4、创建配置文件:以本地系统做支持
svn的配置方法和git差不多,主要使用"spring.cloud.config.server.svn.*"
# native:启动从本地读取配置文件,必须指定active的值,才可以使用本地文件配置模式
spring.profiles.active=native
#以本地做文件系统后端
spring.cloud.config.server.native.search-locations=file:///e:/git/config-repo
从classpath中加载配置文件:以classpath开头
-
如果不配置值,则默认值:classpath:/, classpath:/config
2、config client 客户端配置映射
1、创建应用
Pom文件中引入
-
创建主类
创建springboot应用主类,加入SpringBootApplication注解
-
创建配置文件
将配置中心的相关配置配置在bootstrap. properties中,不要配置appliaction.properties。因为服务启动时,会从bootstrap中读取配置,然后从远程配置中心读取配置文件,最后再从appliaction中获取配置,如果有相同的配置项,则后面的会覆盖前面读到的值。所以如果配置中心的配置配置在appliaction,则配置项不会有任何效果。
创建文件名为bootstarp.properties的配置文件,
-
创建测试类
创建一个RESTful接口来返回配置中心的from属性。
通过@value("${from}")注解来绑定配置服务中配置的from属性 EL表达式的形式。
通过注入Environment对象来获取配置属性
访问:http://localhost:7002/from
3、基础架构以及流程
1.远程Git仓库:用来存储配置文件的地方,上述例子中用来存储应用名为conf的多环境配置文件:conf-test.properties
2.Config Server:这是上面构建的分布式配置中心,config-server工程,在该工程中指定了所要连接的Git仓库位置以及账户、密码等连接信息。
3.本地Git仓库:在Config Server的文件系统中,每次客户端请求获取配置信息时,Config Server从Git仓库中获取最新配置到本地(每次获取都会在本地),然后在本地Git仓库中读取并返回,当远程仓库无法获取时,直接将本地内容返回。
客户端应用从配置管理中获取配置信息遵从下面的执行流程:
-
Config Client应用启动时,根据bootstrap.properties中配置的应用名{application}、环境名{profile}、分支名{label},向Config Server请求获取配置信息。
-
Config Server根据自己维护的Git仓库信息和客户端传递过来的配置定位信息去查找配置信息。
-
通过Git clone 命令将找到的配置信息下载到Config Server的文件系统中。
-
Config Server创建Spring的ApplicationContext实例,并从Git本地仓库中加载配置文件,最后将这些配置内容读取出来返回给客户端应用。
-
客户端应用在获得外部配置文件后加载到客户端的ApplicationContext实例,该配置内容的优先级高于客户端jar内部的配置内容,所以在jar包中重复的内容将不再被加载。
Config Server巧妙地通过Git clone将配置信息存于本地,起到了缓存的作用,即使当Git服务端无法访问的时候,依然可以取Config Server中的缓存内容进行使用。
4、安全保护
在Config Server配置中心的pom文件中加入spring-boot-starter-security依赖,
在配置文件中指定用户名和密码
在Config Client客户端中必须配置上配置中心的用户名和密码 配置方式如下:
5、高可用配置
Config Server :
Pom文件中引入Eureka的依赖
主类中添加@EnableEurekaClient的注解
配置文件中指定服务注册中心
Config Client:
Pom文件中引入Eureka的依赖
主类:添加@EnableEurekaClient的注解
bootstrap.properties配置文件中配置:
-
失败快速响应与重试
客户端配置文件中添加:spring.cloud.config.failFast=true
Pom.xml中新增
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
在configServer宕机后可以默认重试6次:日志如下
若多重试次数和重试间隔设置不满意可以通过参数进行调整:
spring.cloud.config.retry.multiplier:初始重试间隔时间(单位为毫秒)默认1000。
spring.cloud.config.retry.initial-interval:下一间隔的倍数,默认为1.1,所以第二次失败后的间隔时间为1100毫秒。
spirng.cloud.config.retry.max-interval:最大间隔时间,默认为2000毫秒。
spring.cloud.config.retry.max-attempts:最大的重试次数,默认6次
-
动态刷新配置
在config-client项目的pom.xml中新增spring-boot-starter-actuator的依赖,其中包含了/refresh端点的实现,该端点将用于实现客户端应用的配置信息的重新获取与刷新。
启动conf客户端并访问一次:返回值为test
修改文件中的值为:from=test refresh commit。之后提交git
再访问一次客户端:返回值如上
执行命令localhost:7002/refresh //必须使用post请求,由于没有工具写的测试方法
再访问一次客户端localhost:7002/from 就可以看到from的值就是更改以后的了
Spring Cloud Bus:消息总线
在微服务架构的系统中,我们通常使用轻量级的消息代理来构建一个共用的消息主题让系统中所有微服务实例都连接上来,由于该主题中产生的消息会被所有实例监听和消费,所以我们称它为消息总线。
-
消息代理
消息代理(Message Broker)是一种消息验证、传输、路由的架构模式。它在应用程序之间起到通信调度并最小化应用之间的依赖的作用,使得应用程序可以以高效的解耦通信过程。消息代理是一个中间件产品,它的核心是一个消息的路由程序,用来实现接收和分发消息,并根据设定好的消息处理流来转发个正确的应用。它包括独立的通信和消息传递协议,能够实现组织内部和组织间的网络通信。设计代理的目的就是为了能够从应用程序中传入消息,并执行一些特别的操作,下面这些是在企业应用中,我们经常需要使用消息代理的场景:
-
将消息路由到一个或多个目的地。
-
消息转化为其他的表现方式。
-
执行消息的聚集、消息的分解,并将结果发送到它们的目的地,然后重新组合响应返回给消息用户
-
调用Web服务来检索数据。
-
响应事件或错误。
-
使用发布-订阅模式来提供内容或基于主题的消息路由。
目前已经有非常多的开源产品可以供大家使用,比如:
AtiveMQ,Kafka,RabbitMQ,RocketMQ
-
-
RabbitMQ 实现消息总线
Eureka server
为Eureka server添加验证时要添加spring-boot-starter-secutity依赖
云模式时一定要设置主机名,不建议使用ip
Eureka client
服务端有验证时 客户端要加上
要想查看springcloud的健康(/health)以及其他状态时要添加spring-boot-starter-actuator依赖