前言
用过dubbo的朋友们都清楚,它作为一个分布式管理框架,大体可以分为三个部分:服务注册中心,服务生产者和服务消费者。Spring Cloud作为一站式分布式框架,自然也提供了相应的组件,来完成服务注册与发现的过程。没有用过分布式管理框架的同学,可以简单这么着理解:上篇说道微服务将以往的工程拆成了多个服务组件,服务组件之间调用管理的框架就是分布式框架。分布式管理框架可以使用服务名的方式来调用其他微服务,而不用显示的配置http调用地址即可实现。
Spring Cloud封装了Netflix,形成了自己相关的系列组件,下面以Eureka为例,介绍服务注册与发现的过程。以下过程中创建的项目,均基于spring boot,IDE为idea,JDK版本为1.8
服务注册中心
Eureka的服务注册中心需要搭建一个Eureka Server,用idea创建一个spring boot项目:File New Project --> Spring Initializr --> 输入创建的项目名称等信息 --> 勾选Eureka Server,这样一个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.von</groupId>
<artifactId>eurekaserver-8761</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>eurekaserver-8761</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.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>Edgware.RELEASE</spring-cloud.version>
</properties>
<dependencies>
<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>
</project>
因为这个实例项目是之前创建的,所以使用的Spring boot的版本为1.0,目前如果直接从Spring官网上进行创建,Spring boot的版本会是2.0,和1.0之间有什么区别,还请读者自行查看。
只要在项目启动类上添加注解:@EnableEurekaServer,即可代表当前工程将作为服务的注册中心。然后需要在配置文件中配置以下内容,这里使用的application.properties文件,用.yml文件配置同样好使:
## 当前项目端口号
server.port=8761
## Eureka server的地址
eureka.instance.hostname=localhost
## 下面两个配置代表自己不能注册自己
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
到此为止,Eureka Server就已经搭建完成了,启动项目即可访问到服务管理页面。在浏览器中输入地址:
http://localhost:8761/,如下图所示,因为目前还没有服务注册到服务中心上来,所以目前的服务实例是空的。
服务生产者
服务注册中心部署完成之后,接下来就改创建服务生产者了,创建项目的过程和上述过程基本一样,只是在选择依赖时不再选择Eureka Server,而是要选择Eureka Discovery,如此就不赘述了。
创建完成后,在启动类上加上注解@EnableEurekaClient,即代表当前服务作为一个Eureka的客户端,将注册到Eureka Server上来提供服务。application.properties配置文件的内容如下所示:
server.port=8762
# 服务注册中心的地址
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/
# 自己的服务名称,用于将来服务消费者调用
spring.application.name=eureka-producer-hello
启动该工程,再刷新服务注册中心的页面,即可发现已经有一个名为eurek-hello的服务注册好了,可以被其他服务来调用了。
注意:这里注册是以IP方式注册的,也可以使用域名注册。如果服务器hosts文件配置了域名,则默认会以域名方式注册。如果要使用IP注册,可以加上下面配置:
spring.cloud.client.ipAddress=192.168.*.*
eureka.instance.preferIpAddress=true
eureka.instance.instance-id=${spring.cloud.client.ipAddress}:${spring.application.name}:${server.port}
后语
在使用Eureka时,要注意它相应的名称,一般将Eureka Server称为Eureka服务端,Eureka Client称为Eureka客户端,但Eureka客户端并不代表着它只是消费服务,同样的它也作为服务生产者为其他消费者提供服务。也就是说,在使用Spring Cloud Eureka时,服务消费者和服务生产者都要注册到注册中心,它们同属于Eureka客户端,既可以消费服务,也可以提供服务。
另外,对于Eureka Server和Eureka Client,都可以搭建集群。对于Eureka Client来说,只需要将多个服务注册为同一个服务名,它们就自动形成了一个集群,当然这多个服务,提供的服务功能还是要一样的。对于Eureka Server来说,同样也可以形成集群的模式,只要创建多个Eureka Server的工程来相互注册就好了。集群的模式在以后的博客中再介绍。