在最初开始构建微服务系统的时候可能服务并不多, 我们可以通过做一些静态配置来完成服务的调用。 比如,有两个服务 A 和 B, 其中服务 A 需要调用服务 B 来完成一个业务操作时, 为了实现服务 B 的高可用, 不论采用服务端负载均衡还是客户端负载均衡, 都需要手工维护服务 B 的具体实例清单。 但是随着业务的发展, 系统功能越来越复杂, 相应的微服务应用也不断增加, 我们的静态配置就会变得越来越难以维护。 并且面对不断发展的业务, 我们的集群规模、 服务的位置 、 服务的命名等都有可能发生变化, 如果还是通过手工维护的方式, 那么极易发生错误或是命名冲突等问题。 同时, 对于这类静态内容的维护必将消耗大量的人力
服务注册
即服务注册中心,每个服务单元向注册中心登记自己提供的服务,将主机与端口号、版本号、通信协议等一些附加信息告知注册中心,注册中心按照服务名分类组织服务清单。如
服务发现
由于在服务治理框架下运作,服务间的调用不再通过指定具体的实例地址来实现,而是通过向服务名发起请求调用实现。如服务C希望调用服务A,服务C需要向注册中心发起咨询服务请求,服务注册中心将A服务的位置清单返回C,如按上例服务A的情况,C便获得了服务A的两个可用位置192.168.0.100:8000和192.168.0.101:8000。当服务C要发起调用的时候, 便从该清单中以某种轮询策略取出一 个位置来进行服务调用。Eukeka包含了客户端和服务器端。Eureka服务器端就是服务注册中心。Eureka客户端主要处理服务的注册与发现。
搭建Eureka Server框架
下面给出Eureka Server端pom文件内容(包含了Spring Boot版本和Spring Cloud版本):
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.13.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Dalston.SR2</spring-cloud.version>
</properties>
<dependencies>
<!--Eureka服务器端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
通过@EnableEurekaServer注解启动一个服务注册中心,如下
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
通常application.properties中需要配置如下:
#应用启动端口
server.port=1111
#Eureka服务器端实例名
eureka.instance.hostname=localhost
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/
默认情况下,服务注册中心会将自己作为客户端来尝试注册自己,所以eureka.client.register-with-eureka设置为false
eureka.client.fetch-registry:由于注册中心的职责是维护服务实例,并不需要去检索服务,所以设置为false
网页访问项目:
可以看到此时applications并没有任何服务。因为我们此时就一个Eureka Server服务,而且规定其不能注册自己。
Eureka Client 客户端框架搭建
下面给出Eureka Client端pom文件内容(包含了Spring Boot版本和Spring Cloud版本):
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.13.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Dalston.SR2</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<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</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
通过@EnableDiscoveryClient将应用设置为服务提供者
@SpringBootApplication
@EnableDiscoveryClient
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
然后在application.properties中将服务注册到服务中心
server.port=8010
server.context-path=/
spring.application.name=eureka-client01
eureka.client.service-url.defaultZone=http://localhost:1111/eureka/
- spring.application.name 表示该spring boot应用的名称
- eureka.client.service-url.defaultZone 表示将服务注册到哪个服务注册中心
可以看到eureka-client01服务已经被注册到Eureka Server中
至此一个简单的服务注册与发现框架即搭建完成,后续会介绍当客户端有多个服务调用时的客户端负载均衡工具rabbion
参考书籍
Spring Cloud微服务实战