eureka基本架构
Eureka基本架构如图
其中涉及到3中角色:
服务注册中心:作为eureka的一个server,提供服务注册和发现的功能。
服务提供者:作为eureka的一个客户端组件,可以对外提供服务。
服务消费者:作为eureka的一个客户端组件,用来消费服务。
服务消费的基本过程如下:首先需要一个服务注册中心eureka server,服务提供者eureka client向服务注册中心eureka server注册,将自己的信息通过 rest API的形式提交给服务注册中心eureka server。服务消费者eureka client向服务注册中心eureka server注册,同时服务消费者获取一份服务注册列表的信息,该列表包含了所有向服务注册中心eureka server注册的服务信息。获取服务注册列表信息之后,服务消费者就知道服务提供者的IP地址,可以通过HTTP远程调度来消费服务提供者的服务。服务消费者和服务提供者对于服务注册中心来讲,都是客户端;服务提供者和服务消费者可能互为提供提供与消费关系。
服务注册中心eureka server
服务注册中心主要用于客户端服务的注册功能,下面我们通过一个具体工程来介绍。
pom.xml中主要依赖信息
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<!-- 声明springboot版本 -->
<version>2.0.6.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>
<!-- 声明springcloud的版本 -->
<spring-cloud.version>Finchley.SR2</spring-cloud.version>
</properties>
<dependencies>
<!-- 使用springMVC注解,引入web依赖包 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 引入springcloud依赖包 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter</artifactId>
</dependency>
<!-- 引入服务注册发现组件 eureka依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
关键部分,springcloud版本声明和eureka依赖的添加两块,springboot1到springboot2,eureka依赖这里有一些变化,这里需要注意下。
application类中,需要增加@EnableEurekaServer注解,标注该类是一个eureka的服务注册中心类
@EnableEurekaServer
@SpringBootApplication
public class EurekaServicecenterApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServicecenterApplication.class, args);
}
}
application.yml 配置文件可以使用yml和properties两种,这里采用yml格式
server:
port: 6781 #服务注册中心端口号
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false #是否向服务注册中心注册自己
fetchRegistry: false #是否检索服务
serviceUrl: #服务注册中心的配置内容,指定服务注册中心位置
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
配置文件中,主要eureka.client.serviceUrl.defaultZone配置,配置服务注册中心位置,后面其它客户端只要将服务中心地址配置为该地址,都会注册到这里来。
启动springcloud服务,在地址栏 http://localhost:6781/ 可以看到,当前没有实例注册过来。
服务提供者eureka provider
服务提供者对于注册中心来讲,是一个客户端client;对于服务消费者来讲,自己是服务提供者;如果消费其它服务时,自己则化身为服务消费者。
服务提供者eureka provider的pom文件与服务注册中心的相同,这里不再描述。
controller层HelloController.java
@EnableEurekaClient
@RestController
public class HelloController {
@ResponseBody
@RequestMapping("/hello")
public String hello(String name) {
return name + ", Welcome to Spring Boot 2";
}
}
这里,与普通springboot不同的是,在类上面增加了@EnableEurekaClient注解,@EnableEurekaClient注解,标注该类是一个服务注册发现组件中的客户端组件。
application.properties配置
spring.application.name=eureka-server
eureka.client.service-url.defaultZone=http://localhost:6781/eureka/
server.port=6782
客户端的配置文件相对简单,配置一个端口号,服务名称和服务注册中心地址
启动springcloud服务后,在服务注册中心地址 http://localhost:6781/ 可以看到,有一个实例注册
该服务便是我们刚注册的服务提供者,服务名称为eureka-server,端口号为6782
我们继续在服务提供者这边测试 http://localhost:6782/hello?name=lisi
可以看到,服务能正常响应,表示服务没有问题。
服务消费者eureka consumer
pom文件与上面相同
controller层ConsumerController.java
@RestController
@EnableEurekaClient
public class ConsumerController {
@Autowired
RestTemplate restTemplate;
@LoadBalanced
@Bean
public RestTemplate rest() {
return new RestTemplate();
}
@RequestMapping("/hi")
public String hello(String name) {
return restTemplate.getForObject("http://eureka-server/hello?name=" + name, String.class);
}
}
controller层中,与服务提供者不同的是,增加了RestTemplate类实例,restTemplate实例,主要用于调用远程服务。这里我们的服务地址,配置上面的服务名。
application.properties
eureka.client.service-url.defaultZone=http://localhost:6781/eureka/
server.port=6783
spring.application.name=eureka-client
内容基本与服务提供者的相似,这里不再细述。
启动springcloud服务后,在服务注册中心可以看到,服务消费者同样注册到了注册中心
测试
我们在地址栏输入 http://localhost:6783/hi?name=wangwu
页面跳转 ,服务消费者成功调用到服务提供者
上面就是本人测试中最简单的服务注册和发现实例,服务可以正常调用起来,关于细节内容没有过多表述,以便于先入门理解。
附工程项目代码下载路径:eureka服务注册发现demo