服务发现之Consul实现
系列目录:
Spring Cloud的服务发现有2种实现方式,一个是Euraka服务,一个是基于Consul的服务。本文先讲讲Eureka的服务发现实现。
什么是Spring Cloud Eureka?
Spring Cloud Eureka 模块提供的功能是被动式的服务发现。 spring cloud eureka 分为两部分:
- @@EnableDiscoveryClient: 该注解表明应用既作为eureka实例又为eureka client 可以发现注册的服务
- @EnableEurekaServer: 该注解表明应用为eureka服务,有可以联合多个服务作为集群,对外提供服务注册以及发现功能
** 什么是服务发现?** 服务发现就像聊天室一个,每个用户来的时候去服务器上注册,这样他的好友们就能看到你,你同时也将获取好友的上线列表. 在微服务中,服务就相当于聊天室的用户,而服务注册中心就像聊天室服务器一样,目前服务发现的解决方案有Eureka , Consul ,Etcd , Zookeeper ,SmartStack ,等等。 本文就来讲讲Eureka,如图所示,Eureka Client通过HTTP(或者TCP,UDP)去Eureka Server注册和获取服务列表,为了高可用一般会有多个Eureka Server组成集群。Eureka会移除那些心跳检查未到达的服务。
搭建服务注册中心: 建立Eureka Server 端
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.zrx</groupId>
<artifactId>minaret-eureka-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>minaret-eureka-server</name>
<description>Eureka注册中心</description>
<!-- org.springframework.booot 父类 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.2.RELEASE</version>
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!-- 属性配置文件 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
<spring.boot.admin.server>1.5.0</spring.boot.admin.server>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- 服务发现 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-client</artifactId>
<version>${spring.boot.admin.server}</version>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
启动应用Application.java
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
public static void main(String[] args) throws Exception {
SpringApplication.run(EurekaApplication.class, args);
}
}
配置application.yml
server:
port: 8761
spring:
application:
name: eureka-service
eureka:
client:
registerWithEureka: false # 禁止 注册中心,注册自己作为服务,默认是可以的
fetchRegistry: false # 禁止 注册中心,注册自己作为服务,默认是可以的,本地是单点so,设置为false
server:
waitTimeInMsWhenSyncEmpty: 0
evictionIntervalTimerInMs: 4000
instance:
hostname: peer1 #对应的hostname
metadataMap:
instanceId: ${spring.application.name}:${spring.application.instance_id:${random.value}}
注册服务提供者
建立Eureka Client 端,例如user-microservice , 这是用户服务。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.zrx</groupId>
<artifactId>minaret-sys-provider-user</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>minaret-sys-provider-user</name>
<description>minaret-sys-provider-user</description>
<!-- org.springframework.booot 父类 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.2.RELEASE</version>
</parent>
<properties>
<spring.boot.admin.server>1.5.0</spring.boot.admin.server>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- Euraka -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<!-- end -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.16</version>
</dependency>
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-client</artifactId>
<version>${spring.boot.admin.server}</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Brixton.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
Application.class
@EnableDiscoveryClient
@SpringBootApplication
public class SysUserApplication {
public static void main(String[] args) {
new SpringApplicationBuilder(SysUserApplication.class).web(true).run(args);
}
}
server:
port: 3333
spring:
application.name: user-microservice-service
# z指定注册中心的位置
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/