SpringCloud之Eureka
前言
由于传统RPC框架随着微服务数目不断增加,体系的复杂度不断提高,尝试手动配置每个服务就很难做到,同时有更高的概率出错。Eureka就是用于服务发现(Service Discovery Server)和注册(Service )的,并且可将服务器配置为高可用性。
一、Eureka单机构建
Eureka单机构建
-
新建模块
eurekaServer1 -
pom.xml添加依赖
<dependencies> <!--eureka-server--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> </dependencies> -
在yaml配置文件中修改配置
server: port: 8761 eureka: instance: hostname: eurekaServer1 client: register-with-eureka: false fetch-registry: false service-url: defaultZone: http://eurekaServer1:8761/eureka/这里逐行解释一下yaml配置文件中的意思
server.port:表示端口号eureka.instance.hostname:表示创建eureka服务端的实例名称eureka.client.register-with-eureka:表示是否在注册中心注册自己eureka.client.fetch-registry:表示自己就是服务注册中心,不需要才从服务中心获取服务信息eureka.client.service-url.defaultZone:表示Eureka Server的地址
-
新建启动类
@SpringBootApplication @EnableEurekaServer public class EurekaServer1 { public static void main(String[] args) { SpringApplication.run(EurekaServer1.class,args); } }@SpringBootApplication不需多说,就是标注主启动类的注解重要的是
@EnableEurekaServer这个注解,表示将该启动类作为Eureka Server -
为了方便后面构建集群式,使用上述方法构建模块
eurekaServer2端口号为8762 -
测试
在浏览器中输入地址
http://eurekaServer1:8761/eureka/显示下图页面,即为成功
将服务提供者注册进Eureka Server
- 创建模块
serviceProvider1 - pom.xml添加依赖
<dependencies>
<!--eureka-client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
- 在yaml配置文件中修改配置
server:
port: 8080
spring:
application:
name: service-provider1
eureka:
client:
register-with-eureka: true
fetchRegistry: true
service-url:
defaultZone: http://localhost:8761/eureka
此时需要将服务注册进eureka,所以将属性
eureka.client.register-with-eureka改为true,需要注册中心获取信息,将属性eureka.client.fetch-registry改为true
- 新建启动类
@SpringBootApplication
@EnableEurekaClient
public class ServiceProvider1 {
public static void main(String[] args) {
SpringApplication.run(ServiceProvider1.class,args);
}
}
@EnableEurekaClient即将服务作为Eureka客户端注册进服务注册中心
- 测试
先启动EurekaServer
eurekaServer1,再启动serviceProvider1,浏览器中输入地址http://localhost:8761/eureka,可以看到serviceProvider1已经注册进去了
- 将服务消费者注册进Eureka Server同理,只不过在启动服务消费者之前,要先将服务提供者启动。这里只讲流程,具体业务逻辑需自行解决。
二、Eureka集群构建
为实现高可用性,假设注册中心只有一个,如果出故障就会使整个服务环境不可用,所以需要构建Eureka集群提高容灾能力
原理
即将两个Eureka Server互相注册进对方的服务中,互相注册,互相守望
步骤
- 修改
eurekaServer1和eurekaServer2的yaml配置文件
# eurekaServer1
server:
port: 8761
eureka:
instance:
hostname: eurekaServer1.com
client:
register-with-eureka: false #false表示不向注册中心注册自己。
fetch-registry: false #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
service-url:
defaultZone: http://eurekaServer2.com:8762/eureka/
# eurekaServer2
server:
port: 8762
eureka:
instance:
hostname: eurekaServer2.com #eureka服务端的实例名称
client:
register-with-eureka: false #false表示不向注册中心注册自己。
fetch-registry: false #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
service-url:
defaultZone: http://eurekaServer1.com:8761/eureka/
这里
defaultZone指向另一个Eureka Server实现相互注册
- 将服务提供者和服务消费者注册进Eureka集群,需要修改两个模块的yaml配置文件
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
即同时注册进两个Eureka Server
三、负载均衡
-
按上述方法新建
serviceProvider2 -
在服务消费者创建
ApplicationContextConfig配置类
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}
@LoadBalanced给RestTemplate赋予负载均衡的能力,后续会在Ribbon(浅浅的挖一个坑😃)中详细讲解
- 在服务消费者HelloController中添加
@RestController
public class Consumer {
@Resource
private RestTemplate restTemplate;
public static final String PROVIDER_URL = "http://CLOUD-PAYMENT-SERVICE";
@GetMapping("/consumer/hello")
public String hello(){
return restTemplate.getForObject(PROVIDER_URL,String.class);
}
}
注意: 不要将
PROVIDER_URL地址写死,否则就没有负载均衡能力扩展:
RestTemplate中的方法getForObject中的参数
PROVIDER_URL即为请求的地址String.class为返回值类型
- 测试
先启动Eureka Server集群,再启动
serviceProvider1和serviceProvider2,以及服务消费者,在浏览器中输入http:/localhost/consumer/hello,会发现网页8080和8081交替出现
说明使用了负载均衡