springcloud将服务者和消费者注册到注册中心(Eureka)

1.服务注册和发现的一些术语解释

1.1服务发现组件的功能

  • 服务注册表:
    服务注册表是一个记录当前可用服务实例的数据库,是服务发现机制的核心。服务注册表提供查询API和管理API,通过查询Api可以查看当前可用的服务实例,通过管理Api可以注册或注册实例。
  • 服务注册:
    就是服务在启动时,将服务实例的网络地址注册到服务注册表中
  • 健康检查:
    服务注册表会通过某些机制(如心跳监测)定期检查已注册的服务,如果发现某个服务不可用,就将其从注册表中移除。
  • 服务注册组件:
    不同人的称谓可能不同,不过说的都是一个组件,有的称为注册中心,服务注册,服务发现,在这里统一称为服务注册发现组件(如Dubbo使用Zookeeper,Edas使用阿里自己定制的AliTomcat,我们这里使用Netfix提供的Eureka,当然springcloud也支持其它的注册发现组件)。

    1.2服务注册发现方式

    不同的框架用的组件可能不能,不过总的来说有客户端发现和服务端发现,Eureka和Zookeeper使用客户端发现方式,Consul属于服务端发现方式。

    2.将服务端和客户端注册到Eureka注册组件中

    今天介绍的内容均可以查看这里的中文文档:https://springcloud.cc/spring-cloud-dalston.html#_spring_cloud_netflix

    2.1创建Eureka服务注册组件项目

    这里的注册中心跟zookeeper不同,zookeeper启动之后再启动服务即可注册实例,我们这里需要自己开发注册中心项目。使用IDEA创建名为microservice-discovery-eureka的项目,pom中引入 spring-cloud-starter-eureka-server的jar包。
    1
    2
    3
    4
    5
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka-server</artifactId>
    <version>1.3.4.RELEASE</version>
    </dependency>

在MicroserviceDiscoveryEurekaApplication方法中添加注解@EnableEurekaServer,表明这是一个服务注册组件的服务端

1
2
3
4
5
6
7
@SpringBootApplication
@EnableEurekaServer
public class MicroserviceDiscoveryEurekaApplication {
public static void main(String[] args) {
SpringApplication.run(MicroserviceDiscoveryEurekaApplication.class, args);
}
}

将application.porperties注册文件改名为application.yml,之后进行配置。

1
2
3
4
5
6
7
8
server:
port: 8761
eureka:
client:
fetch-registry: false
register-with-eureka: false
service-url:
defaultZone: http://localhost:8761/eureka

Eureka的默认端口就是8761,其中“defaultZone”是一个魔术字符串后备值,为任何不表示首选项的客户端提供服务URL(即defaultZone是有用的默认值)。
现在就可以启动这个Main方法,之后再浏览器中输入http://localhost:8761 ,打开页面如下:
eureka首页

2.2将服务者注册到Eureka中

首先引入jar包spring-cloud-starter-eureka,这里引的跟上面引的jar不一样,上面的服务端,这里的是客户端。

1
2
3
4
5
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.3.4.RELEASE</version>
</dependency>

在之前的main方法中添加@EnableEurekaClient注解,表明它是客户端。

1
2
3
4
5
6
7
@SpringBootApplication
@EnableEurekaClient
public class MicroserviceProviderUserApplication {
public static void main(String[] args) {
SpringApplication.run(MicroserviceProviderUserApplication.class, args);
}
}

修改application.yml配置文件,配置应用实例名称,应用访问方式等。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
server:
port: 7900
spring:
jpa:
generate-ddl: false
show-sql: true
hibernate:
ddl-auto: none
datasource:
platform: h2
schema: classpath:schema.sql
data: classpath:data.sql
application:
name: microservice-provider-user #应用名称
eureka:
client: #配置eureka客户端
service-url:
defaultZone: http://localhost:8761/eureka
instance:
prefer-ip-address: true #配置在eureka中显示ip地址
instance-id: ${spring.application.name}:${spring.cloud.client.ipAddress}:${spring.application.instance_id:${server.port}} #配置应用访问方式。应用名:IP:端口号

现在启动服务者项目即可将服务注册到Eureka中,刷新eureka的页面可看到注册的服务实例。

2.3将调用者注册到Eureka中

调用者和服务者注册到Eureka的方式一样,首先引入spring-cloud-starter-eureka的jar包,之后给main方法配置@EnableEurekaClient注解,再修改application.yml的配置文件,不再赘余。

1
2
3
4
5
6
7
8
9
10
11
12
server:
port: 7901
spring:
application:
name: microservice-consumer-movie #配置项目名
eureka:
client: #配置要访问的注册中心地址,即eureka所在的地址
service-url:
defaultZone: http://localhost:8761/eureka
instance: #配置是否显示ip
prefer-ip-address: true
instance-id: ${spring.application.name}:${spring.cloud.client.ipAddress}:${spring.application.instance_id:${server.port}}

至此服务者和调用者均已经注册到服务注册组件Eureka中了,刷新http://localhost:8761/ 即可查看,至于如何调用,下一节介绍

3.补充知识

补充身份认证和健康检查。

3.1身份认证

在Eureka的项目中引入springboot提供的安全认证jar包,服务者和调用者不用引入。

1
2
3
4
5
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
<version>1.3.4.RELEASE</version>
</dependency>

在application.yml中配置要访问的用户名和密码,注册中心,服务者,消费者均要修改访问路径跟Eureka中defaultZone的一致。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
security:
basic:
enabled: true
user:
name: admin
password: qwe123
server:
port: 8761
eureka:
client:
fetch-registry: false
register-with-eureka: false
service-url:
defaultZone: http://admin:qwe123@localhost:8761/eureka

这样在访问http://localhost:8761/ 的时候就需要输入用户名和密码了。

3.2健康检查

微服务中要想保证服务可用就必须要保证每个服务均是可用的,Eureka中提供了健康检查机制,检测到某个服务不可用会将其从注册表中移除,下面介绍如何进行健康检查:

  • 在每一个需要注册到注册中心的服务项目中都引入spring-boot-starter-actuator的jar包(Eureka项目中不引入)

    1
    2
    3
    4
    5
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
    <version>1.3.4.RELEASE</version>
    </dependency>
  • 在每个要注册到注册中心的项目的application.yml中都加入 healthcheck:enabled: true的配置(Eureka的配置文件不加)。示例如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    server:
    port: 7901
    user:
    userServicePath: http://localhost:7900/simple/
    spring:
    application:
    name: microservice-consumer-movie #配置项目名
    eureka:
    client: #配置要访问的注册中心地址,即eureka所在的地址
    healthcheck:
    enabled: true
    service-url:
    defaultZone: http://admin:qwe123@localhost:8761/eureka
    instance: #配置是否显示ip
    prefer-ip-address: true
    instance-id: ${spring.application.name}:${spring.cloud.client.ipAddress}:${spring.application.instance_id:${server.port}}

这样在某个服务不可用是就会从注册表中剔除。

刘俊重 wechat
欢迎关注我的微信公众号
坚持原创技术分享