springcloud(三)-Eureka

Eureka是Netflix开源的一款提供服务注册和发现的产品,它提供了完整的Service Registry和Service Discovery实现。也是springcloud体系中最重要最核心的组件之一。

 服务发现简介

服务中心又称注册中心,管理各种服务功能包括服务的注册、发现、熔断、负载、降级等,比如dubbo admin后台的各种功能。

有了服务中心调用关系会有什么变化?

上一节我们见识了springcloud最简单的微服务调用。类似于

项目A调用项目B

正常调用项目A请求项目B

有了服务发现Eureka机制,任何一个服务都不能直接去掉用,都需要通过服务中心来调用


如果是项目A调用项目B,项目B在调用项目C

这时候调用的步骤就会为两步:第一步,项目A首先从服务中心请求项目B服务器,然后项目B在从服务中心请求项目C服务。

这样做有什么好处呢?如果只有这样一两个服务,而且访问量不大的情况下,这样做确实有点画蛇添足的感觉。但是,如果像这样的服务由二三十个,上百个呢?画一张图来描述几十个项目之间的相互调用关系全是线条,任何其中的一个项目改动,就会牵连好几个项目跟着重启,巨麻烦而且容易出错。通过服务中心来获取服务你不需要关注你调用的项目IP地址,由几台服务器组成,每次直接去服务中心获取可以使用的服务去调用既可。

由于各种服务都注册到了服务中心,就有了去做很多高级功能条件。比如几台服务提供相同服务来做均衡负载;监控服务器调用成功率来做熔断,移除服务列表中的故障点;监控服务调用时间来对不同的服务器设置不同的权重等等。

Eureka 简介

Eureka由两个组件组成:Eureka服务器和Eureka客户端。Eureka服务器用作服务注册服务器。Eureka客户端是一个java客户端,用来简化与服务器的交互、作为轮询负载均衡器,并提供服务的故障切换支持。Netflix在其生产环境中使用的是另外的客户端,它提供基于流量、资源利用率以及出错状态的加权负载均衡。

用一张图来认识以下:

上图简要描述了Eureka的基本架构,由3个角色组成:

1、Eureka Server

  • 提供服务注册和发现

2、Service Provider

  • 服务提供方
  • 将自身服务注册到Eureka,从而使服务消费方能够找到

3、Service Consumer

  • 服务消费方
  • 从Eureka获取注册服务列表,从而能够消费服务

编写Eureka Server

spring cloud已经帮我实现了服务注册中心,我们只需要很简单的几个步骤就可以完成。

1.创建一个maven工程,pom.xml文件添加依赖

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

 1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 2   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 3   <modelVersion>4.0.0</modelVersion>
 4 
 5   <groupId>com.itmuch.cloud</groupId>
 6   <artifactId>microservice-discovery-eureka</artifactId>
 7   <version>0.0.1-SNAPSHOT</version>
 8   <packaging>jar</packaging>
 9 
10   <name>microservice-discovery-eureka</name>
11   <url>http://maven.apache.org</url>
12 
13   <parent>
14         <groupId>org.springframework.boot</groupId>
15         <artifactId>spring-boot-starter-parent</artifactId>
16         <version>1.5.9.RELEASE</version>
17     </parent>
18 
19   <properties>
20     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
21     <java.version>1.8</java.version>
22   </properties>
23 
24   <dependencies>
25            <dependency>
26             <groupId>org.springframework.boot</groupId>
27             <artifactId>spring-boot-starter-web</artifactId>
28         </dependency>
29         <!--         用于监控spring boot 端点 -->
30         <dependency>
31             <groupId>org.springframework.boot</groupId>
32             <artifactId>spring-boot-starter-actuator</artifactId>
33         </dependency>
34         <dependency>
35             <groupId>org.springframework.boot</groupId>
36             <artifactId>spring-boot-starter-tomcat</artifactId>
37         </dependency>
38         <dependency>
39             <groupId>org.springframework.boot</groupId>
40             <artifactId>spring-boot-devtools</artifactId>
41             <optional>true</optional> <!-- 这个需要为 true 热部署才有效 -->
42         </dependency>
43         <dependency>
44             <groupId>org.springframework.cloud</groupId>
45             <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
46         </dependency>
47   </dependencies>
48   
49 <!--   引入spring cloud 的依赖 -->
50     <dependencyManagement>
51         <dependencies>
52             <dependency>
53                 <groupId>org.springframework.cloud</groupId>
54                 <artifactId>spring-cloud-dependencies</artifactId>
55                 <version>Edgware.RELEASE</version>
56                 <type>pom</type>
57                 <scope>import</scope>
58             </dependency>
59         </dependencies>
60     </dependencyManagement>
61   
62 <!--   添加spring-boot 的maven插件 -->
63     <build>
64         <plugins>
65             <plugin>
66                 <groupId>org.springframework.boot</groupId>
67                 <artifactId>spring-boot-maven-plugin</artifactId>
68             </plugin>
69         </plugins>
70     </build>
71 </project>
点击展开

2.编写启动类,添加@EnableEurekaServer注解,声明这是一个Eureka Server

package com.itmuch.cloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {

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

3.配置文件application.yml

server:
  port: 8083
eureka:
  client:
    registerWithEureka: false
    fetchRegistry: false
    serviceUrl:
      defaultZone: http://localhost:8083/eureka

简单介绍一下:

  • eureka.client.registerWithEureka:表示是否将自己注册到Eureka Server,默认为true。由于当前应用就是Eureka Server,故而这里设为false。
  • eureka.client.fetchRegistry:表示是否从Eureka Server获取注册信息。默认为true。因为这是一个单点的Eureka Server,不需要同步其他的Eureka Server节点的数据,所以设为false 
  • eureka.client.serviceUrl.defaultZone:设置与Eureka Server交互的地址,查询服务和注册服务都需要依赖这个地址。默认是http://localhost:8083/eureka;多个地址间可使用“,”分隔。

这样一个Eureka Server就编写完了。

测试

启动Eureka Server 启动类。访问 http://localhost:8083/,可以打开界面

目前没有任务服务注册到上面。

将微服务注册到Eureka Server上

改写上一节的microservice-simple-provider-user

1.pom.xml文件添加依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

2.配置application.yml

server:
  port: 8084
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8083/eureka/
  instance:
    prefer-ip-address: true
spring:
  application:
    name: microservice-provider-user
  jpa:
    generate-ddl: false
    show-sql: true
    database-platform: org.hibernate.dialect.MySQL5Dialect
    hibernate:
      ddl-auto: none
  datasource:
    url: jdbc:mysql://localhost:3306/cloud?useUnicode=true&characterEncoding=UTF-8
    username: root
    password: 1234
    driver-class-name: com.mysql.jdbc.Driver
  http:
    multipart:
      maxFileSize: 100Mb
      maxRequestSize: 100Mb
logging:
  level:
    root: INFO
    org.hibernate: INFO
    org.hibernate.type.descriptor.sql.BasicBinder: TRACE
    org.hibernate.type.descriptor.sql.BasicExtractor: TRACE

其中,spring.application.name用于指定注册到Eureka Server上的应用名称;eureka.instance.prefer-ip-address = true 表示将自己的IP注册到Eureka Server。若不配置该属性或将其设置为false,则表示注册微服务所在操作系统的hostname到Eureka Server 。

另外,同样的操作,给microservice-consumer-movie也来一遍。

测试

启动 microservice-discovery-eureka

启动 microservice-provider-user

启动 microservice-consumer-movie

注:因为每一个服务在启动的时候都会注册到服务发现上面去,如果eureka没开的话,服务在启动的时候会报找不到服务发现的错误,所以一般都是先开eureka。但是就算你后启动eureka,每一个服务客户端都会在eureka启动之后,再连到上面去,不会影响使用。

访问http://localhost:8083/,可看到页面

由此图可知,我们的两个微服务客户端已经被注册到Eureka Server 上了。

我们访问http://localhost:8082/user/1,得到结果

{"id":1,"username":"account1","name":"张三","age":20,"balance":98.23}

由此可知,movie服务通过Eureka Server 找到 user 服务,访问获得了结果。

OK!完美!

这一节没多少新代码,该有的都再上面贴出来了。源码就不放了。

原文地址:https://www.cnblogs.com/fengyuduke/p/10593791.html