欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SpringCloud 服务的注册与发现_1

程序员文章站 2022-05-19 16:10:03
...

SpringCloud 服务发现组件 Eureka

1. 服务概念 (注册中心)

服务注册与发现对于微服务系统来说非常重要。有了服务发现与注册,你就不需要整天改服务调用的配置文件了,你只需要使用服务的标识符,就可以访问到服务。

 SpringCloud 服务的注册与发现_1

2. 服务注册和发现

Eureka介绍:

Netflix开源了他们另一个架构——Eureka开发的服务发现框架,它是一个RESTful服务,用来定位运行在AWS域(Region)中的中间层服务。

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

ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是GoogleChubby一个开源的实现,是HadoopHbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

 SpringCloud 服务的注册与发现_1

所有的服务端及访问服务的客户端都需要连接到注册管理器(eureka服务器)。服务在启动时会自动注册自己到eureka服务器,每一个服务都有一个名字,这个名字会被注册到eureka服务器。使用服务的一方只需要使用该名字加上方法名就可以调用到服务。

Spring cloud的服务注册及发现,不仅仅只有eureka,还支持ZookeeperConsul。默认情况下是eurekaspring 封装了eureka,使其非常简单易用,只需要比传统应用增加一行代码就可以使用了,这一行代码就是一个注解。我们按以下步骤实现服务注册和发现功能。

 

1)首选需要建立eureka服务器

你只需要创建一个空的maven工程,并引入spring boot的相关starter即可,然后创建一个近乎空的执行类,工程如下图:

 SpringCloud 服务的注册与发现_1

 

Main类中我们加入如下代码:

package cn.et;
 
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);
}
}


可以看到只需要使用@EnableEurekaServer注解就可以让应用变为Eureka服务器,这是因为spring boot封装了Eureka Server,让你可以嵌入到应用中直接使用。至于真正的EurekaServerNetflix公司的开源项目,也是可以单独下载使用的。

 

application.yml配置文件中使用如下配置:


server:
  port: 8761

eureka:
  instance:
    hostname: localhost
  client:
    registerWithEureka: false
    fetchRegistry: false
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/


  在application.properties配置文件中使用如下配置:

  server.port=8761

  eureka.instance.hostname=localhost

  eureka.client.registerWithEureka=false

  eureka.client.fetchRegistry=false

  eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/


 做完这些后当然,还要改一下pom文件,增加eureka-serverstarter即可:

 

<dependency>

                            <groupId>org.springframework.cloud</groupId>

                            <artifactId>spring-cloud-starter-eureka-server</artifactId>

</dependency>

 

详细配置如下: 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>cn.et</groupId>
  <artifactId>SPRINGCLOUD_EUREKASERVER</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.9.RELEASE</version>
</parent>
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Dalston.SR4</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>
</dependencies>
</project>


如此eureka服务器就完成了,在命令行启动就可以了。

 

2)让服务使用eureka服务器

 

application.name是指定进行服务注册时该服务的名称。这个名称就是后面调用服务时的服务标识符(这是服务发现的功能,我们在后面章节具体介绍)。当然,pom文件也需要增加:

<dependency>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-starter-eureka</artifactId>

</dependency>

 

 

3)、使用@EnableEurekaServer注解

@EnableEurekaServer,启动一个服务注册中心提供给其他应用进行对话

 SpringCloud 服务的注册与发现_1

 

4、启动springboot,并访问http://localhost:8761/

 SpringCloud 服务的注册与发现_1

 

问题:客户端的负载均衡??

 

3. 发送邮件为案例 来阐述原理

 SpringCloud 服务的注册与发现_1

任何一个项目都要有一个注册中心(高可用),如果其挂了,就不能调用,所以说是很重要的。

 

配置文件

Application.yml:

server:

  port: 8761

 

eureka:

  instance:

    hostname: localhost

  client:

    registerWithEureka: false

    fetchRegistry: false

    serviceUrl:

      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

注:里面必须要有空格,否则会报错。