Spring Cloud 是一个基于Spring Boot 实现的微服务架构开发工具.它为微服务架构中涉及的配置管理、服务治理、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等操作的提供了一种简单的开发方式.(百度的基础概念)
Spring Cloud Config 配置管理工具,支持使用git存储配置内容.
Spring Cloud Netflix:核心组件:
Eureka:服务治理组件,包含服务注册中心,服务注册发现
Hystrix:容错管理组件.断路器等
Ribbon:客户端负载均衡的服务调用组件.
Feign:基于Ribbonhe Hystrix的声明是服务调用组件
Zuul:网关组件,提供智能路由、访问过滤等.
…
src/main/resources 目录是spring boot 的配置目录.支持格式properties、YAML(无法通过@PropertySource注接加载配置,可以使用@ConfigurationProperties注解)
spring boot 可以根据不用环境配置多个配置文件,通过启动时加载不同配置.
基础配置:
# 默认启动端口信息
server:
port: 8080
spring:
# 配置默认启动的环境配置
profiles:
active: dev
# 服务名称
application:
name: demo-server
# dev de 环境配置文件
spring:
profiles: dev
server:
port: 3000
pom文件中加入依赖:
org.springframework.boot
spring-boot-starter-actuator
即可实现基础的监控管理,会根据依赖自动创建基础的监控和管理端点
eg:/health
也可以自定重写或者配置定义监控端点,yaml配置如下
# 默认启动端口信息
server:
port: 8080
spring:
# 配置默认启动的环境配置
profiles:
active: dev
# 服务名称
application:
name: demo-server
# 配置监控端点
management:
endpoint:
shutdown:
enabled: true
endpoints:
web:
exposure:
include: health,shutdown,mappings,info,beans,metrics,threaddump
通过在普通的springboot项目的启动类添加@EnableEurekaServer,可以开启服务注册中心.
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
server:
port: 1111
eureka:
server:
#关闭自我保护(本地调试时使用,正式生产环境最好打开)
enable-self-preservation: false
#清理间隔,默认60s
eviction-interval-timer-in-ms: 10000
instance:
ip-address: 127.0.0.1
#标识注册中心的hostname
hostname: peer1
prefer-ip-address: true
client:
#true 会默认向注册中心注册服务,false 则禁止这种行为
register-with-eureka: false
#fasle 不检索其他服务,
fetch-registry: false
service-url:
#另一个注册中心地址
defaultZone: http://127.0.0.1:1112/eureka/
通过访问http://127.0.0.1:1111 或者 http://127.0.0.1:1112 可以进入eureka可以界面,查看是否配置成功,现有注册的服务.
普通的springboot项目添加@EnableDiscoveryClient,实现eureka客户端,通过配置文件实现注册中心的注册.
# 默认启动端口信息
server:
port: 8080
spring:
# 配置默认启动的环境配置
profiles:
active: dev
# 服务名称
application:
name: demo-server
# 配置监控端点
management:
endpoint:
shutdown:
enabled: true
endpoints:
web:
exposure:
include: health,shutdown,mappings,info,beans,metrics,threaddump
eureka:
instance:
prefer-ip-address: true
#服务续约的心跳时间,默认30s
lease-renewal-interval-in-seconds: 10
#服务续约的失效时间
lease-expiration-duration-in-seconds: 20
#标识注册中心的hostname
# hostname: ${spring.application.name}:${server.port}
# ip-address: 127.0.0.1
# instance-id: ${eureka.instance.prefer-ip}:${spring.application.name}:${server.port}
client:
# #true 会默认向注册中心注册服务,false 则禁止这种行为
register-with-eureka: true
# #fasle 不检索其他服务,
fetch-registry: true
service-url:
defaultZone: http://127.0.0.1:1111/eureka/,http://127.0.0.1:1112/eureka/
服务消费者也需要进行eureka的注册,配置和服务者雷同
ribbon实现负载均衡需要在启动类里加载RestTemplate的bean实例.使用@LoadBalanced注解开始负载均衡
@Bean
@LoadBalanced
RestTemplate restTemplate(){
return new RestTemplate();
}
ribbon会在客户端维护一份服务清单,默认更新时间为30s可以根据需求配置,registry-fetch-interval-seconds: 30
server:
port: 4000
spring:
application:
name: ribbon-consumer
eureka:
client:
# #true 会默认向注册中心注册服务,false 则禁止这种行为
register-with-eureka: true
# #fasle 不检索其他服务,
fetch-registry: true
service-url:
defaultZone: http://127.0.0.1:1111/eureka/,http://127.0.0.1:1112/eureka/
#服务消费者,缓存清单更新时间,默认30s
registry-fetch-interval-seconds: 30
instance:
prefer-ip-address: true
#服务续约的心跳时间,默认30s
lease-renewal-interval-in-seconds: 10
#服务续约的失效时间
lease-expiration-duration-in-seconds: 20
#标识注册中心的hostname
# hostname: hostname
# ip-address: 127.0.0.1
# instance-id: ${spring.application.name}:${server.port}
RestTempplate.getForEntity(String url, Class responseType, Object… uriVariables)
RestTemplate restTemplate=new RestTemplate();
String name="David";
ResponseEntity<User> responseEntity=restTemplate.getForEntity("http://demo-server/hello?name={1}",User.class,name);
User user=responseEntity.getBody();
ResponseEntity对象是spring对HTTO请求响应的封装,存储HttpStatus(404,500),它的父类还有httpHeaders.上述例子最后一个参数将会替换{1} 的占位符.
RestTempplate.getForEntity(String url, Class responseType, Map
RestTemplate restTemplate=new RestTemplate();
Map<String,String> newMap=new HashMap<>(16);
String name="David";
newMap.put("name",name);
ResponseEntity<User> responseEntity=restTemplate.getForEntity("http://demo-server/hello?name={name}",User.class,newMap);
User user=responseEntity.getBody();
RestTempplate.getForEntity(URI url,Class responseType),该方法使用URI对象代替之前的url和urlVariables参数执行访问地址和参数绑定
RestTemplate restTemplate=new RestTemplate();
UriComponents uriComponents= UriComponentsBuilder.fromUriString("http://demo-server/hello?name={name}").build()
.expand("David").encode();
URI uri=uriComponents.toUri();
ResponseEntity<User> responseEntity=restTemplate.getForEntity(uri,User.class);
User user=responseEntity.getBody();
RestTempplate.getForObject(URI url, Class responseType),是对getForEntity的进一步封装
RestTemplate restTemplate=new RestTemplate();
UriComponents uriComponents= UriComponentsBuilder.fromUriString("http://demo-server/hello?name={name}").build()
.expand("David").encode();
URI uri=uriComponents.toUri();
User user=restTemplate.getForObject(uri,User.class);
restTemplate中对post请求第一种:postForEntity函数和get请求中的getForEntity类似
第二种:postForObject方法和getForObject方法类似
第三种:postForLocation函数,一般登录或者注册需要重定向的时候使用
RestTemplate restTemplate=new RestTemplate();
User user=new User();
user.name="David";
URI uri=restTemplate.postForLocation("http://demo-server/hello",user);
put(String url, @Nullable Object request, Object… uriVariables)
put(String url, @Nullable Object request, Map
put(URI url, @Nullable Object request)
RestTemplate restTemplate=new RestTemplate();
User user=new User();
user.name="David";
Long id=1000L;
restTemplate.put("http://demo-server/hello/{1}",user,id);