服务注册与发现
对于微服务来说,最常被提及的两个概念就是服务注册和服务发现。所谓服务注册,就是把一个服务的基本信息注册到注册中心。所谓服务发现,就是从注册中心获取到服务的基本信息。
注册中心的实现有很多,比如zookeeper、consul、eureka、etcd等,当然还有人使用redis、mysql等作为服务注册中心,个人不推荐使用数据库和内存数据库等产品。
具体使用哪个,其实也没有一个标准答案,因为就实际情况来看,使用哪个的都有,也没有说哪一个产品绝对优于其他产品,通常是在某些场景下更好。但是Spring Cloud推荐我们使用
这些基本信息通常会包含ip地址,或者还会包含端口号和其他信息,根据服务的实现会有所区别。对于rpc等长连接来说,特别是一个端口提供一个类的服务时,端口号通常是必须的。对于短连接来说,端口号通常是可选的。
需要说明的是,Sping Cloud给的解决方案是基于http(s)的方案,这个后面我们会更加清楚这一点。
开始实战
我们本小节主要介绍服务注册,我们在下一节会介绍服务发现。
接下来我们的动作主要分为两个,第一个是创建搭建一个注册中心,它接受服务的注册,第二个则是我们去构建一个微服务,它向注册中心进行注册。
首先我们先建立一个项目,这里我们是基于maven去构建的,我们的group名不妨叫做: com.mengzhidu.java.demo,它的artifactId不妨叫做sc-demo。
然后我们新建两个子模块:
(1).eureka-server,它用来作为注册中心。
(2).user-service,它用来作为用户服务。
此时我们的基本的项目骨架如下所示:
然后我们的pom.xml如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<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.mengzhidu.java.demo</groupId>
<artifactId>sc-demo</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>eureka-server</module>
<module>user-service</module>
</modules>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.3.RELEASE</version>
</parent>
<properties>
<spring-cloud.version>Dalston.SR1</spring-cloud.version>
</properties>
<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>
</project>
这里它引入了springboot作为parent,然后它引入了spring cloud的基本依赖。
接下来我们就来分别构建注册中心和一个具体的服务吧。
注册中心
我们开始编写eureka-server这个子模块吧,我们首先在pom.xml中引入如下依赖:
<?xml version="1.0" encoding="UTF-8"?>
<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">
<parent>
<artifactId>sc-demo</artifactId>
<groupId>com.mengzhidu.java.demo</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>eureka-server</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
</dependencies>
</project>
这里我们引入了spring-cloud-starter-eureka-server,它是作为服务端的依赖,然后我们来编写一个启动类吧。
我们在我们的目录下创建一个EurekaServerApplication,然后我们写入如下代码:
package com.mengzhidu.java.demo.scdemo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
/**
* Created by xinxing on 2019/1/14
*/
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
然后我们新建一个application.yml文件,我们写入如下配置项:
server:
port: 8761
eureka:
instance:
hostname: localhost
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka
这里简单介绍下上述配置:
(1).server.port表示监听8761端口。
(2).eureka.client.register-with-eureka为false则表示不注册自己。
(3).eureka.client.fetch-registry为false则表示不做服务检索。
(4).eureka.client.service-url.defaultZone是一个默认的注册中心地址。
此时我们的结构如下所示:
然后我们运行main方法启动程序,待程序起来之后,我们访问8761端口,我们会看到如下信息:
其中红色箭头指向的地方会显示服务注册的列表,因为我们这里还没有注册服务,所以这里为空。
服务注册
然后我们向注册中心来注册一个服务吧,首先我们在pom.xml中导入如下依赖:
<?xml version="1.0" encoding="UTF-8"?>
<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">
<parent>
<artifactId>sc-demo</artifactId>
<groupId>com.mengzhidu.java.demo</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>user-service</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>
然后我们编写启动类,如下所示:
package com.mengzhidu.java.demo.scdemo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
/**
* Created by xinxing on 2019/1/14
*/
@SpringBootApplication
@EnableEurekaClient
public class UserServiceApplication {
public static void main(String[] args) {
SpringApplication.run(UserServiceApplication.class, args);
}
}
然后我们来配置application.yml文件吧,如下所示:
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka
server:
port: 9001
spring:
application:
name: user-service
这里我们简单介绍下配置文件吧:
(1).server.port是这里监听的端口。
(2).spring.application.name是当前服务的名称。
(3).eureka.client.service-url.defaultZone则是注册中心的地址。
然后我们启动当前的微服务,我们可以看到,它被注册到了注册中心,如下所示:
可以看到,我们的status中显示了我们当前服务的状态,在192.168.1.103这个ip下面,9001端口是可用状态,而它是为user-service这个服务提供支持的。
小节
对于服务注册,我们本小节就介绍到这里啦。我们下一小节的任务是介绍服务发现。