您的位置:首页 > 其它

(1) 服务治理Eureka注册中心

2017-10-14 16:21 316 查看
    Spring Cloud Eureka是Spring Cloud Netfix微服务中的一部分,spring团队基于Netfix Eureka
做二次封装,主要完成了微服务架构中的服务治理功能。Spring Cloud不仅可以使用Eureka做注册中心,
同时也可以使用Zookeeper做为注册中心。这里主要了解使用Eureka作为注册中心的应用。
在分析Eureka Server之前,我们先了解几个概念。
一 服务治理
在传统项目中,我们可以通过配置完成服务间的调用。比如,A服务调用B服务完成业务操作,
无论是否采用负载均衡还是客户端负载,我们都需要手动维护服务列表。但是,随着业务的发展,
拆分的服务实例越来越多,服务配置越来越多,手动维护变得十分困难,看着都头大。
为了解决服务维护,产生大量服务治理框架和产品,比如Sprng Cloud, Dubbo等。
这些框架和产品的实现都是围绕注册中心与服务发现机制来完成对微服务应用实例的自动化管理。
服务治理主要有以下两个核心概念:
(1) 服务注册
服务治理框架都会构建一个注册中心,用来供每个服务单元登记,每个服务向注册中心登记
自己提供的服务,主要包括服务的主机,端口,版本,通信协议等等信息,注册中心根据
服务名分类管理服务清单。
比如,提供A和B两个服务,A运行于192.168.200.12:8000、192.168.200.13:8000位置上,
B服务运行于192.168.200.14:8001、192.168.200.15:8001位置上。当这些服务启动并注册到注册中心后,
注册中心根据服务名维护服务清单,同时,服务注册中心以心跳方式去监测服务清单中的应用是否可用,
如果不可用,就会将其从服务清单中剔除,达到排除故障的效果。
以上例子在注册中心的服务清单如下:
服务名       位置
A               192.168.200.12:8000、192.168.200.13:8000
B               192.168.200.14:8001、192.168.200.15:8001
(2) 服务发现
在微服务中,服务间的调用跟传统的调用方式不一样,传统使用具体的地址访问,
而在微服务中,通过服务名发起请求调用实现。
比如A服务调用B服务,B服务向注册中心发起咨询服务请求,将服务清单返回给A服务,
如果如上B有多个位置,A服务将会以某种轮询策略取出一个位置进行服务调用,
也就是使用某种客户端负载均衡算法达到轮询访问,减轻服务端压力。

二 Netfix Eureka
Spring Cloud Eureka使用Netfix Eureka来实现服务注册与发现组件,
主要包括服务端和客户端两部分。
Eureka服务端,也是我们常说的注册中心。与其它注册中心一样,均可支持高可用配置。
Eureka客户端,主要处理服务的注册和发现。客户端通过注解和参数配置的方式,
嵌入在客户端应用程序的代码中,在应用程序运行时,Eureka客户端向注册中心注册
自身提供的服务并周期性地发送心跳更新它的服务租约。同时,也可以从服务端查询
当前注册的服务信息并把它们缓存到本地并周期性地刷新服务状态。

三 搭建Eureka服务注册中心

1. 创建一个Spring Boot应用,通过Maven构建,工程名为eureka-server。
工程结构如下:



2. pom.xml中内容
<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.lanhuigu</groupId>
<artifactId>eureka-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>eureka-server</name>
<url>http://maven.apache.org</url>
<!-- spring boot -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.4.RELEASE</version>
<relativePath/>
</parent>
<!-- spring cloud -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
</properties>

<dependencies>
<!-- eureka server -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

</project>


3. application.properties配置内容
# 服务名称和端口
spring.application.name=eureka-server
server.port=1111

# 定义Instance ID 的hostname
eureka.instance.hostname=localhost

# 自我注册禁用(在默认情况下,服务注册中心也会将自己作为客户端来尝试注册它自己,设置为false)
eureka.client.register-with-eureka=false
# 是否检索服务(由于注册中心的职责就是维护服务实例,所以就不需要去检索服务,设置为false)
eureka.client.fetch-registry=false
logging.file=${spring.application.name}.log

# 是否开启注册中心自我保护机制(true开,false关,默认为开)
eureka.server.enable-self-preservation=false


4. EurekaServerApplication应用启动类内容
package com.lanhuigu;

import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
/**
* @SpringBootApplication 启动一个Spring Boot应用程序
* @EnableEurekaServer 注解启动一个服务注册中心提供给其他应用进行会话
*/
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {

public static void main(String[] args) {
new SpringApplicationBuilder(EurekaServerApplication.class).web(true).run(args);
}

}


5. 运行EurekaServerApplication中的main方法启动Eureka Server
访问地址: http://localhost:1111/
浏览器响应:



在红线框中并没有看到注册的服务,是因为没有向注册中心提供服务注册。
到此,单服务Eureka Server构建完成。

四 新建一个服务提供者,并向注册中心注册
1. 新建一个Spring Boot应用,Maven构建工程名为eureka-client。工程结构如下:



2. pom.xml内容
<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.lanhuigu</groupId>
<artifactId>eureka-client</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>

<name>eureka-client</name>
<url>http://maven.apache.org</url>
<!-- spring boot -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.4.RELEASE</version>
<relativePath/>
</parent>
<!-- spring cloud -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
</properties>

<dependencies>
<!-- spring boot的相关web,主要包括spring mvc,web容器等等 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- spring boot单服务单元测试 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<!-- eureka的客户端,用于注册和发现服务 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>

</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

</project>


3. application.properties配置内容
# 服务名称
spring.application.name=hello-service

# 定义端口
server.port=2222

# 指定注册中心地址
eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/


4. HelloController控制层类内容
package com.lanhuigu.controller;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
/**
* @RestController这个注解等价于spring mvc用法中的@Controller+@ResponseBody
*/
@RestController
public class HelloController {
private final Logger logger= Logger.getLogger(getClass());

// 客户端服务发现,接口
@Autowired
private DiscoveryClient discoveryClient;
/**
* @RequestMapping配置请求映射
*/
@RequestMapping(value = "/hello", method = RequestMethod.GET)
public String hello() {
// getLocalServiceInstance为过时方法,这里为了方便而使用其测试,获取服务实例
ServiceInstance instance = discoveryClient.getLocalServiceInstance();
logger.info("/hello, host:" + instance.getHost() + ", service_id:" + instance.getServiceId());
return "Hello World";
}
}


5. EurekaClientApplication启动类
package com.lanhuigu;

import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* @SpringBootApplication 启动一个Spring Boot应用程序
* @EnableDiscoveryClient 服务发现与注册,当应用启动时,将应用注册到配置的注册中心
*/
@EnableDiscoveryClient
@SpringBootApplication
public class EurekaClientApplication {

public static void main(String[] args) {
new SpringApplicationBuilder(EurekaClientApplication.class).web(true).run(args);
}

}


6. 服务启动后,刷新注册中心,从Eureka注册中心可以看到HELLO-SERVICE应用



7. 运行EurekaClientApplication中main方法,启动eureka-client应用
访问地址: http://localhost:2222/hello
浏览器响应:



控制台打印日志:
/hello, host:localhost, service_id:hello-service
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: