您的位置:首页 > 编程语言 > Java开发

SpringCloud学习笔记(3)—— 服务治理:Spring Cloud Eureka

2018-12-20 15:21 696 查看

Spring Cloud Eureka 是Spring Cloud Netflix微服务套件中的一部分,它基于Netflix Eureka做了二次封装,主要负责完成微服务架构中的服务治理功能。

我们将学习下面的这几个核心内容

  • 构建服务注册中心
  • 服务注册与服务发现
  • Eureka 的基础架构
  • Eureka 的服务治理机制
  • Eureka 的配置

一、服务治理

服务治理可以说是微服务架构中最为核心和基础的模块, 它主要用来实现各个微服务实例的自动化注册和发现。

1.服务注册

在服务治理框架中,通常都会构建一个注册中心,每个服务单元向注册中心登记自己提供的服务,将主机与端口号、版本号、通信协议等一些附加信息告知注册中心,注册中心按照服务名分类组织服务清单。另外,服务注册中心还需要以心跳的方式去监测清单中的服务是否可用,若不可用需要从服务清单中剔除,达到排除故障服务的效果。

服务名 位置
服务A 192.168.0.100:8000、192.168.0.101:8000
服务B 192.168.0.100:9000、192.168.0.101:9000、192.168.0.102:9000
2.服务发现

云端负载均衡,一个基于 REST 的服务,用于定位服务,以实现云端的负载均衡和中间层服务器的故障转移。

3、搭建服务注册中心

创建一个基础的Spring Boot 工程,命名为eureka-server,并在pom中引入必要的依赖内容,代码如下:

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.gildata</groupId>
<artifactId>eureka-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>eureka-server</name>
<description>eureka-server project for Spring Boot</description>

<properties>
<java.version>1.8</java.version>
</properties>
<!-- 使用dependencyManagement进行版本管理 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.RC1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>

</dependencyManagement>

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
<version>2.0.2.RELEASE</version>
</dependency>
</dependencies>

通过@EnableEurekaServer注解启动一个服务注册中心提供给其他应用进行对话。比如下面的例子:

@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {

public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}

}

在默认设置下,该服务注册中心也会将自己作为客户端来尝试注册它自己,所以我们需要禁用它的客户端注册行为

spring.application.name=spring-cloud-eureka-server
server.port=8761
# 由于该应用中心为注册中心,所有设置为false,代表不向注册中心注册自己
eureka.client.register-with-eureka=false
# 由于注册中心的职责就是维护服务实例,它并不需要去检索服务,所以也设置为false
eureka.client.fetch-registry=false
eureka.instance.hostname=localhost
eureka.client.serviceUrl.defaultZone=http://localhost:${server.port}/eureka/

启动端口访问如下:

4、注册服务提供者

完成了服务注册中心的搭建以后,接下来我们尝试将一个既有的Spring Boot应用加入Eureka的服务治理体系中去。
① 新建maven项目
②添加pom依赖

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.spring
4000
framework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
<version>2.0.2.RELEASE</version>
</dependency>
</dependencies>

③ 写启动类

@EnableDiscoveryClient
@SpringBootApplication
public class SpringbootDemoApplication {

public static void main(String[] args) {
SpringApplication.run(SpringbootDemoApplication.class, args);
}

}

④ 添加controller

/**
* Created by liaock on 2018/12/17.
*/
@RestController
public class HelloController {
@RequestMapping("/hello")
public String index(){
return "Hello World !";
}
}

⑤修改配置文件

spring.application.name=hello-service
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/

通过spring.application.name属性为服务命名,通过eureka.client.service-url.defaultZone 属性来指定服务注册中心的地址,地址和注册中心设置的地址一致。
启动服务,访问Eureka的信息面板,即可看到服务的注册信息。

5、高可用注册中心

在微服务架构这样的分布式环境中,需要充分考虑发生故障的情况,所以在生产环境中必须对各个组件进行高可用部署。
Eureka Server 的设计一开始就考虑了高可用问题,在Eureka的服务治理中,所有节点既是服务提供方,也是服务消费方,服务注册中心也一样。
Eureka Server 的高可用实际上就是将自己作为服务向其他服务注册中心注册自己,这样就可以形成一组互相注册的服务注册中心,以实现服务清单的相互同步,达到高可用的效果。
下面我们来搭建一个高可用服务注册中心集群,构建一个双节点的服务注册中心集群:

  • 创建application-peer1.properties,作为peer1 服务中心的配置,并将serviceUrl指向peer2:
spring.application.name=eureka-server
server.port=1111

eureka.instance.hostname=peer1
eureka.client.service-url.defaultZone=http://peer2:1112/eureka/
  • 创建 application-peer2.properties,作为peer2 服务中心的配置,并将serviceUrl指向peer1:
spring.application.name=eureka-server
server.port=1112

eureka.instance.hostname=peer2
eureka.client.service-url.defaultZone=http://peer1:1111/eureka/
  • 在/etc/hosts 文件中添加对peer1 和 peer2的转换,让上面配置的host形式的serviceUrl 能在本地正确访问到
  • 通过spring.profiles.active 属性来分别启动peer1 和 peer2
java -jar eureka-server-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer1
java -jar eureka-server-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer2
  • 在设置了多节点的服务注册中心之后,服务提供方还需要做一些简单的配置才能将服务注册到Eureka Server 集群中
spring.application.name=hello-service

eureka.client.service-url.defaultZone=http://peer1:1111/eureka/,http://peer2:1112/eureka/

下面我们自动该服务,可以观察到 hello-service 服务同时被注册到了peer1和peer2上。若此时断开peer1,由于服务同时也注册到了pee2,因此在peer2上的其他服务依然可以访问hello-service,从而实现服务注册中心的高可用。

6、服务发现与消费

我们已经实现了服务注册中心和服务提供者,下面我们来构建一个服务消费者,它主要完成两个目标,发现服务以及消费服务。其中 服务发现任务是由Eureka的客户端完成,而服务消费的任务是由Ribbon完成,Ribbon是一个基于HTTP和TCP的客户端负载均衡器,它可以通过在客户端中配置的ribbonServerList服务端列表去轮询访问以达到均衡负载的作用。

①为了试验Ribbon的客户端负载均衡功能,我们通过java -jar命令方式来启动两个不同端口的 hello-service

②创建一个Spring Boot的基础工程来实现服务消费者,取名为ribbon-consumer,并添加如下依赖

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
<version>2.0.2.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-ribbon -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
<version>2.0.2.RELEASE</version>
</dependency>
</dependencies>

③创建主类,通过@EnableDiscoveryClient注解让该应用注册为Eureka客户端应用,以获得服务发现能力。通过@LoadBalanced注解开启客户端负载均衡。

@EnableDiscoveryClient
@SpringBootApplication
public class RibbonConsumerApplication {

@LoadBalanced
@Bean
RestTemplate restTemplate(){
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(RibbonConsumerApplication.class, args);
}

}

④创建 ConsumerController 类并实现 /ribbon-consumer接口,通过上面创建的RestTemplate来实现对 HELLO-SERVICE服务提供的/hello 接口进行调用,可以看到这里访问的地址是服务名 HELLO-SERVICE 而不是具体的地址

/**
* Created by liaock on 2018/12/19.
*/
@RestController
public class ConsumerController {
@Autowired
RestTemplate restTemplate;
@RequestMapping(value="/ribbon-consumer",method = RequestMethod.GET)
public String helloConsumer(){
return restTemplate.getForEntity("http://HELLO-SERVICE/hello",String.class).getBody();
}

}

⑤ 修改配置文件

spring.application.name=ribbon-consumer
server.port=9000
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/

启动ribbon-consumer 应用后,在Eureka面板中可以看到我们实现的RIBBON-CONSUMER 服务

此时,访问http://localhost:9000/ribbon-consumer,成功返回了“Hello World !”

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: