Eureka
什么是Eureka
Eureka是Netflix微服务套件中的一部分,它是基于REST的服务。主要负责微服务架构中的服务治理功能。用来实现各个微服务受理的自动化注册与发现。Eureka包含了两部分:Eureka Server和Eureka Client。
基础架构
Eureka包括了两部分:Eureka Server和Eureka Client。其中Eureka Client又包括了服务提供者和服务消费者。所以Eureka的基础架构有三个核心的元素:Eureka Server(服务注册中心)、服务提供者、服务消费者。
服务注册中心
提供了服务的注册与发现功能。
Eureka Client
Eureka Client是一个Java应用程序,它在启动的时候主动到注册中心去注册自己的服务,同时它也能从服务端查询当前注册服务信息并把它们缓存到本地并周期性地刷新服务状态。
Eureka Client又可以分为两种角色:Application Server(服务提供者)和Application Client(服务消费者)。一个是服务的提供者一个是服务的消费者,两者没有绝对的划分,当提供服务时就是Server,当调用其他服务时就是Client。
搭建Eureka服务
因为Spring Cloud是基于SpringBoot的,所以搭建的服务都是基于SpringBoot项目,可以直接使用idea创建SpringBoot,或者在Spring Initializr中创建。
服务注册中心
pom文件
<!-- SpringBoot的版本-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
<relativePath/>
</parent>
<!-- SpringCloud的版本-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Edgware.SR4</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
配置文件
# 自己取的应用名称,可以不要
spring.application.name = spring-cloud-eureka
# 服务端口
server.port = 8761
# 是否将自己注册到Eureka server中,默认为true
eureka.client.register-with-eureka=false
# 是否从eureka Server中获取服务注册信息,默认为true
eureka.client.fetch-registry=false
# 服务地址
eureka.client.serviceUrl.defaultZone=http://localhost:${server.port}/eureka/
启动类
@EnableEurekaServer
注解表明这是一个Eureka Server注册中心。启动之后在浏览器访问localhost:8761
,就可以看到注册中心的可视化界面了。
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
服务提供端
服务提供端需要将自身注册到注册中心,为服务消费者提供服务。
pom文件
<!-- SpringBoot的版本-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
<relativePath/>
</parent>
<!-- SpringCloud的版本-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Edgware.SR4</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
**配置文件 **
# 应用名字,注册到注册中心的名称
spring.application.name=spring-cloud-provider
# 服务端口
server.port=8080
# 注册中心地址
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/
启动类
其中注解@EnableDiscoveryClient
表示此服务时一个Eureka的客户端。
@SpringBootApplication
@EnableDiscoveryClient
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}
生产者
创建一个controller,返回字段字符串表示生产者生产的东西。
@RestController
public class ProviderController {
@GetMapping("/provider/service")
public String provider(){
return "I'm provider";
}
}
服务消费端
同理创建一个SpringBoot项目代表客户端。
pom文件
<!-- SpringBoot的版本-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
<relativePath/>
</parent>
<!-- SpringCloud的版本-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Edgware.SR4</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
配置文件
# 应用名称,注册到注册中心的名称
spring.application.name=spring-cloud-consumer
# 服务端口
server.port=9000
# 注册中心地址
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/
启动类
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
服务消费者
创建一个fegin接口调用注册中心的服务。@FeignClient
表示调用的是哪个服务,这个名字和spring.application.name
一样。GetMapping
是生产端方法的路径。
@FeignClient(name= "spring-cloud-provider")
public interface ProviderInterface {
@GetMapping(value = "/provider/service")
public String hello();
}
创建一个controller,调用服务
@RestController
public class ConsumerController {
@Autowired
private ProviderInterface providerInterface;
@GetMapping("/consumer/service")
public String consumer() {
return providerInterface.hello();
}
}
最后在浏览器中访问:http://localhost:9000/consumer/service
,如果拿到了服务端返回字符串,表明搭建成功。
高可用服务注册中心
在微服务架构中,如果只有一个注册中心,在注册中心故障时,就会导致整个系统不可用。在单节点的注册中心,我们使用了两个配置让注册中心不注册自己,所以在高可用中,我们不在加这两个注解,让注册中心向其他服务注册自己。
# 是否将自己注册到Eureka server中,默认为true
eureka.client.register-with-eureka=false
# 是否从eureka Server中获取服务注册信息,默认为true
eureka.client.fetch-registry=false
配置DNS
在C:\Windows\System32\drivers\etc\HOSTS
文件中添加ip和地址的映射。
127.0.0.1 peer1
127.0.0.1 peer2
创建一个SpringBoot项目
pom文件
<!-- SpringBoot的版本-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
<relativePath/>
</parent>
<!-- SpringCloud的版本-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Edgware.SR4</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
配置文件
在配置文件中配置两个eureka 的配置。构建了高可用架构的时候,可以为defaultZone配置多个值:http://peer1:8762/eureka,http://peer1:8761/eureka
,使用逗号分割。
spring:
application:
name: eureka-cluster
profiles: peer1
server:
port: 8761
eureka:
instance:
hostname: peer1
client:
serviceUrl:
defaultZone: http://peer1:8762/eureka
---
spring:
application:
name: eureka-cluster
profiles: peer2
server:
port: 8762
eureka:
instance:
hostname: peer2
client:
serviceUrl:
defaultZone: http://peer1:8761/eureka
启动类
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
启动方式
mvn clean package
java -jar xx.jar --spring.profiles.active=peer1
java -jar xx.jar --spring.profiles.active=peer2
启动后在浏览器访问:localhost:8761
和localhost:8762
就可以看到可视化的注册中心了,在peer1的DS Replicas可以看到peer2,在peer2的DS Replicas可以看到peer1。这样就表示高可用服务注册中心就搭建成功了。