一、介绍
SpringCloud利用SpringBoot的开发便利性,巧妙地简化了分布式系统基础设施的开发。
提供了以下功能:
服务注册于发现:Eureka
负载均衡:Ribbon
声明式调用:Feign
熔断器:Hystrix
路由网关:Zuul
分布式配置中心:SpringCloud Config
消息总线:SpringCloud Bus
服务链路追踪:SpringCloud Sleuth
微服务监控:SpringBoot Admin
二、Eureka
创建服务注册中心,需要用到Spring Cloud Netflix的Eureka。
Eureka是一个基于REST的服务注册、发现模块。
SpringCloud的服务注册发现不仅可以用Eureka,还可以用Zookeeper和Consul。
我们需要创建两个eureka server,一个作为注册中心(Eureka Server),一个作为服务生产者(Eureka Client)。
1、创建注册中心的Eureka Server
(1)通过spring initialir创建一个SpringBoot工程
(2)在创建工程时需引入Eureka的依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
(3)要让这个工程变成服务注册中心,只需要一个注解:@EnableEurekaServer,加载SpringBoot的启动Application上。
@EnableEurekaServer
@SpringBootApplication
public class SpringCloudDemoApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudDemoApplication.class, args);
}
}
(4)配置application.yml
Eureka包含两个角色,instance和client,instance为注册中心,client为需要注册的服务。client注册以后需要向instance发送心跳,保证client的存活。
只要配置了eureka.instance,就可以成为注册中心。就可以通过配置的eureka.instance.hostname,server.port访问注册中心的web页面。
server:
port: 8761
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
server.port:本机服务的端口号
registerWithEureka:instance自身也是client,可以通过该属性决定是否需要注册自己到Eureka服务器。
fetchRegistry:表示是否需要从Eureka服务器获取注册信息。
Eureka的配置属性都在开源项目spring-cloud-netflix-master中定义(spring boot连文档都没有,只能看源码了),在这个项目中有两个类EurekaInstanceConfigBean 和EurekaClientConfigBean,分别含有eureka.instance和eureka.client相关属性的解释和定义。
启动SpringBoot项目,可以通过 http://localhost:8761/ 访问注册中心web页面。
2、创建服务生产者的Eureka Server
当client向instance注册时,会提供元数据(主机、端口、主页url等)给instance,并开始发送心跳。如果心跳超时,通常会将该client从instance删除。
创建过程与instance创建相似,区别在于:
(1)注解。client的Application注解为@EnableEurekaClient
@SpringBootApplication
@EnableEurekaClient
@RestController
public class HelloserviceApplication {
@Value("${server.port}")
String port;
public static void main(String[] args) {
SpringApplication.run(HelloserviceApplication.class, args);
}
@RequestMapping("/say")
public String say(String name){
return "hello,"+ name +";this is port:"+port;
}
}
(2)配置。
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
server:
port: 8762
spring:
application:
name: service-hi
eureka.client.serviceUrl.defaultZone:Eureka Instance的eureka.client.serviceUrl.defaultZone
spring.application.name:服务名。很重要,服务与服务直接的调用都是依赖这个。
启动SpringBoot项目,可以通过 http://localhost:8762/say?name=longtian 访问该方法。