微服务架构在开发阶段是很爽的,每个功能相对独立,在部署的时候就会遇到这样的疑问,各服务之间是什么关系呢?在后续开发过程中又增加新的微服务外部又怎么才能在不改动其他代码的情况下被访问到呢?有没有办法在一个平台上看到所有微服务的运行状态呢?这里就需要一个微服务的管理者来管理各个微服务并使其保证有序运行,服务注册中心Eureka的作用就是解决这个问题。
Eureka是基于spring boot的CS架构的服务注册中心,Eureka Server自带一个管理后台,有较丰富的微服务控制功能,每个微服务都要作为一个Eureka Client注册到Eureka Server,包括路由网关、配置中心等组件都应该注册到Eureka Server,其关系如下:
我们用IDEA来开发一组Eureka Server和Eureka Client:
先创建一个maven项目,在pom.xml文件中加入以下依赖:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.0.RELEASE</version>
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Camden.SR2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<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-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
删掉项目的src等目录,pom.xml文件用于全局管理各module,再在项目中创建一个名为discover的module,在resource目录下写一个配置文件application.yml,
写入Eureka Server的配置信息:
server:
port: 8090
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false
fetchRegistry: false
ServiceURL:
defoultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
这里面的server.port是我自己定义的,eureka.instance.hostname写自己服务器域名或IP,由于是Eureka Server,要把注册和获取注册项设为false,eureka.client.ServiceURL
写上Eureka Server的服务地址,其他客户端通过该地址注册服务
,
再在src目录下新建package和启动项目的主文件(里面必须有main方法):
package com.tzy.discovery;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class Main {
public static void main(String[] args){
SpringApplication.run(Main.class,args);
}
}
@SpringBootApplication表示这个应用是spring boot应用
@EnableEurekaServer表示该应用是Eureka Server
这样一个Eureka Server就开发完成了,配置run下面的Edit Configurations,添加配置maven项目,运行该项目,打开浏览器输入地址localhost:8090/,
就可以看到Eureka Server的控制台了。
可以看到,当前是没有服务注册进来的。
接下来做Eureka Client,步骤跟server是一样的,新建一个module,命名为userService,先添加依赖:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.0.RELEASE</version>
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Camden.SR2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
在resource目录下创建配置文件application.yml
eureka:
client:
service-url:
defaultZone: http://localhost:8090/eureka/
server:
port: 9000
spring:
application:
name: service-user
eureka.client.service-url里的内容和Eureka Server中的是一样的,客户端用它来找到服务注册中心;
server.port是微服务的端口,可自定义;
spring.application.name是微服务的应用名,是区分微服务的标志,除了需要负载均衡的相同服务外,一般不同功能的微服务命名要不同;
在src目录下创建package和启动文件Main.java(这个文件可以自定义命名),代码如下:
package com.tzy;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableEurekaClient
public class Main {
public static void main(String[] args){
SpringApplication.run(Main.class,args);
}
}
@EnableEurekaClient表示注册该应用为Eureka Client
然后我们就可以写一个简单的Controller来试一下功能了
package com.tzy.userService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class GetUserController {
@RequestMapping(value = "/getUser")
public String getUser(){
return "Hello,cloud";
}
}
不关闭Eureka Server,启动Eureka Client,在浏览器地址栏输入localhost:9000/getUser,会看到Hello,cloud
再打开Eureka Server的后台可以看到,这个服务已经注册到Eureka Server中了。
所有的微服务都是这样把自己注册到Eureka Server的,如果某个服务宕掉了,就可以在后台中看到,Eureka是不是非常有用呢。