SpringCloud注册中心--Eureka
博客同步至GitPress:https://gitpress.io/@yangshijie/spring_cloud_eureka
Eureka组件称为注册中心;
IDEA注册中心搭建
创建父工程
父工程中不需要不含src包,作用只是作为一个工程存放下面几个子工程,每个子工程都是独立的Springboot工程,里面分别有Eureka注册中心服务、分发服务、多个数据服务等;服务见可以互相调用;服务需要在Eureka注册中心去注册;
在IDEA中,File-->New-->Project,选择Maven,然后Next填入必要的信息(包名等),接下来填入项目名和选择地址即可;
创建Eureka注册中心
注册中心也是一个Springboot工程,提供注册服务,管理其中所注册的其他服务,其他子工程向注册中心注册信息,并周期性向注册中心发送心跳来保持注册链接,当心跳超过时间未发送时,注册中心将该实例删除;
在IDEA中,右击父工程名,New-->Module,选择Spring initializr,然后Next填入必要的信息,接下来选择Eureka Discovery,右侧选择Eureka Server,最后填入项目名和选择地址即可;
创建Eureka客户端
客户端服务也是一个独立的Springboot工程,向Eureka注册中心注册,所有注册的client之间可以互相访问,并周期性的向注册中心服务发送心跳来维持注册状态,否则会被注册中心删除注册信息;
在IDEA中,右击父工程名,New-->Module,选择Spring initializr,然后Next填入必要的信息,接下来选择Eureka Discovery,右侧选择Eureka Discovery,填入项目名和选择地址即可;
Eureka组成
服务端
Eureka的服务端就相当于是一个只管理注册服务的东西,每个微服务在这里注册自己的信息,并持续性的(默认30s一次)向这里发送心跳,来维持状态,当超过指定的(默认是90s)时间未收到客户端服务的心跳时,服务端就会删除掉该注册的信息;
在服务端注册的微服务之间可以相互调用,并且注册之后可以通过统一的动态路由转发到达每个客户端服务,例如实现分功能的服务(例如一个服务做订单的管理,另一个做商品库存的管理等);
服务端其实也可以看做是一个客户端服务,不过由于其只做注册,不实现具体功能,在配置的时候需要在配置文件中配置不注册自己的信息,只作为服务端使用;
application.yml配置
在配置文件中可以配置服务端的主机名、端口,是否注册自己等信息;
server:
port: 8761
eureka:
#指定主机名称
instance:
hostname: localhost
#server 一定程度上也是client,互为client
client:
#由于自己就是服务器,不需要注册到自己
register-with-eureka: false
#由于自己就是服务器,不需要从服务器获取注册信息
fetch-registry: false
#服务地址
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
启动类
作为服务端,需要在其启动类上面通过注解配置其为注册的服务端,使用@EnableEurekaServer注解标签;
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
客户端
客户端都是相对独立的Springboot服务工程,作为实现具体业务的服务工程,将自己注册到Eureka服务端,即注册中心,并周期性的向注册中心发送心跳维持自己的状态,客户端工程可以互相调用已经注册的其他客户端服务工程的功能;
例如,商城类服务,一个客户端工程负责订单的处理,另一个负责商品库存的处理,当生成订单时,订单服务端需要去调用库存服务查询库存来确定是否生成订单等;
application.yml配置
在客户端yml配置文件中,配置该服务的serviceId,即spring.application.name,这个会在利用Zuul组件动态转发路由时使用到,并且可以指定其端口等,也可以配置一些元数据metadata(map格式),这个可以用来手动做负载均衡,指定访问的服务节点;
spring:
application:
name: data-server-a
server:
port: 8762
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
启动类
客户端服务在其启动类上通过@EnableEurekaClient注解来标明这是个客户端;
@EnableEurekaClient
@SpringBootApplication
public class DataServerBApplication {
public static void main(String[] args) {
SpringApplication.run(DataServerBApplication.class, args);
}
}
父工程管理
到此,Spring Cloud的基础工程初步搭建起来,目前只使用到了Eureka这个组件,管理了服务端和客户端;
在使用IDE(IDEA)创建时,IDE会自动将pom文件中的相关依赖生成;
在父工程的pom文件中,将所有的springboot子工程(Module),包括服务端和客户端,通过<module>标签注册到父工程中统一管理起来,并且在各个子工程中,将<parent>标签该为父工程的信息;
父工程pom文件
<modules>
<module>eureka-server</module>
<module>dispatch-server</module>
<module>data-server-a</module>
<module>data-server-b</module>
... ...
</modules>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
子工程pom文件
<parent>
<groupId>com.ysj</groupId>
<artifactId>spring_cloud_demo</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>data-server-a</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>data-server-a</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR1</spring-cloud.version>
</properties>
工程结构
工程的结构即为如下:
spring_cloud_demo ## 父工程
|---- eureka-server ## 注册中心,服务端
|---- dispatch-server ## 客户端,分发服务(文中未提到,做路由转发用的服务)
|---- data-server-a ## 客户端,具体数据服务A
|---- data-server-b ## 客户端,具体数据服务B
运行服务
此时将这几个服务分别跑起来,打开http://localhost:8761/即可看到该工程的先关信息,每个自工程也可以通过各自的端口去访问;