(一)SpringCloud之服务发现——Netflix Eureka

学习目标:

学习五大核心框架中的Eureka


学习内容:

提示:学习建立客户端,服务端并简单测试使用


作用:实现服务治理(服务注册与发现)

简介:Spring Cloud Eureka是Spring Cloud Netflix项目下的服务治理模块。

由两个组件组成:Eureka服务端和Eureka客户端。

Eureka服务端用作服务注册中心。支持集群部署。

Eureka客户端是一个java客户端,用来处理服务注册与发现。

在应用启动时,Eureka客户端向服务端注册自己的服务信息,同时将服务端的服务信息缓存到本地。客户端会和服务端周期性的进行心跳交互,以更新服务租约和服务信息。(划重点)
 

接下来进行代码实现,在实践中出真知

(一)建立Eureka服务端

1.1.打开IDEA点击【File】-->【New】-->【Project】

1.2.将【Server URL】更改为使用阿里的【http://start.aliyun.com】否则会连接不上导致错误

1.3. 然后我们这里选用【SpringBoot2.3.7.RELEASE】也就是正式版,然后选择

spring web 和 Eureka Server后点击【Create】创建SpringBoot项目

 1.4.这里穿插一个知识点,在以往的SpringBoot工程中,你是不是司空见惯了以下这种方式进行版本控制。

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.4.7</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

这里我们将使用<dependencyManagement>进行版本控制,当前我们使用的阿里源构建,创建出来的打开pom文件你会发现没有看到parent,取而代之的是dependencyManagement,一般情况下,企业都有自己的parent依赖包,然后所有的项目都必须继承对应的parent包,这时候,我们就可以通过这种方式使用springboot

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>${spring-boot.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

1.5.接着将application.properties的后缀更改为yml(推荐使用yml树形结构更直观)

 1.6.打开application.yml填写配置文件信息

server:
  port: 8761 #服务注册中心的端口号
eureka:
  instance:
    hostname:  localhost #服务注册中心的IP地址
  client:
    register-with-eureka: false #是否往服务注册中心注册自己
    fetch-registry: false #是否检索服务
    service-url: #指定服务注册中心的地址
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

 1.7.接着需要在启动类上添加 @EnableEurekaServer 注解

package com.studycloud.eurekaserver;

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

@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {

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

}

 1.8.启动服务,正常运行端口号为:8761

 1.9.访问  http://localhost:8761/ 进入管理页面

(二)建立Eureka客户端

1.1建立Eureka服务提供者,提供者其实是一个客户端,将服务注册到Eureka中

还是先建立一个工程,加入SpringWeb 和 Eureka Client

1.2 还是将application.properties的后缀更改为yml(推荐使用yml树形结构更直观),并写入配置内容

eureka:
  client:
    serviceUrl: #注册中心的地址
      defaultZone: http://localhost:8761/eureka/
server:
  port: 8762  #服务端口号
spring:
  application:
    name: eureka-service-provider #提供者的服务名称

 1.3接着需要在在启动类上添加 @EnableEurekaClient 注解

这里注意一下啊:Client端的@EnableEurekaClient 注解如果不写的话也是没问题的,我没找到原文或者引用说为什么,谁知道的话可以私信一下我,我补一下这里,为了区分我还是加这个注解的,有兴趣的可以试一试,但是服务端的@EnableEurekaServer注解是不能省略的

 1.4配置好了以后,启动该项目,成功启动

 1.5接着还是打开Eureka管理页面查看,提供者已经注册上去了。

 2.1,我们再创建一个Eureka服务提供者B,和前面一样只是改了个端口和名称,application.yml的配置如下

(前面的提供者名称我改为了A,这个为B)

eureka:
  client:
    serviceUrl: #注册中心的地址
      defaultZone: http://localhost:8761/eureka/
server:
  port: 8763  #服务端口号
spring:
  application:
    name: eureka-service-providerB #提供者的服务名称

2.2,再次启动,查看管理端,可以看到我们有AB两个提供者,提供服务

2.3接下来我们给我们的这两个服务提供者,协商一段逻辑代码

例如我们做一个Controller 写一个来获取名字的方法

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {

    @RequestMapping("/test")
    public String test(){
        return "获取到了服务A的名字";
    }

}
package com.studycloud.eurekaclientproducer;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {

    @RequestMapping("/test")
    public String test(){
        return "获取到了服务B的名字";
    }

}

2.4调用一下两个方法,测试下结果,是没有问题的,获取到的结果也是对的

 3.1现在我们再来做一个消费者,其实还是一个Client,

创建Eureka-client-consumerA,端口配置为8764,其他的配置和上面一样哦

eureka:
  client:
    serviceUrl: #注册中心的地址
      defaultZone: http://localhost:8761/eureka/
server:
  port: 8764  #服务端口号
spring:
  application:
    name: eureka-service-consumerA #消费者的服务名称

3.2接着再启动类中添加代码实例化RestTemplate,使用他来测试我们的

RestTemplate 是从 Spring3.0 开始支持的一个 HTTP 请求工具,它提供了常见的REST请求方案的模版,例如 GET 请求、POST 请求、PUT 请求、DELETE 请求以及一些通用的请求执行方法 exchange 以及 execute。RestTemplate 继承自 InterceptingHttpAccessor 并且实现了 RestOperations 接口,其中 RestOperations 接口定义了基本的 RESTful 操作,这些操作在 RestTemplate 中都得到了实现。接下来我们就来看看这些操作方法的使用。

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
@EnableEurekaClient
public class ConsumerClientApplication {

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

    /**
     * 实例化RestTemplate
     * @return
     */
    @LoadBalanced
    @Bean
    public RestTemplate rest() {
        return new RestTemplate();
    }

}

3.3再创建一个TestController来进行消费

eureka-service-providerA 其实就是我们的供应者的服务器名称

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
public class TestController {

    @Autowired
    RestTemplate restTemplate;

    @RequestMapping("/test")
    public String test(){
        String result = restTemplate.getForObject("http://eureka-service-providerA/test",String.class);
        return result;
    }

}

3.4来运行起来我我们来调用一下8764端口的消费者,看是什么结果

如下图,只能获取到A服务,至少证明我们的接口是通了,并且被Erueka分配给了服务A

 

3.5 .将消费者的 http://eureka-service-providerA/test更改为http://eureka-service-provider/test

很简单我们从单个提供者到多个提供者

更改提供者的名称都为【eureka-service-provider】

 

 3.6此时我们再次运行程序,看下管理端

 3.7,再次运行方法查看结果(这是轮询的机制进行分发的,到此如果你实际去操作了,你应该有自己的想法了)

 

至此我们创建的工程已经做好,下面将开始试着去实现一个小功能来理解它。

这里总结一下上面的

1)8761端口为Eureka服务端,并设置了不能注册自己

2)8762和8163端口都是客户端,作为服务提供者

3)8764为消费者

  • 8762和8163端口都是客户端将服务注册到Eureka Server
  • 8764去访问 http://service-provider/test 实际是Eureka Server提供了一个服务器例如A进行韩式调用
  • 再次访问时,Eureka 采用默认轮询的方法所以依次是A B但是第一次不保证是哪个

Eureka 和 Zookeeper的不同:

分布式设计定理:CAP(不了解的可以查一下)

  • Eureka 设计侧重AP,也就是可用性。结构为:点对点,每个点互为主从,如果有一个节点的数据发生变化,其他节点会自动同步数据,并且客户端也会缓存数据,并且尽量尝试连接

  • Zookpeer设计侧重CP,一致性。结构为:Leader/Follwer主从,如果主节点宕机,集群无法使用,内部将触发选举的动作,故障阶段可以使用但是不保证正确性。本地缓存,但是不推荐

  • 注册中心业务推荐使用Eureka ,因为注册信息不经常变动,一致性基本得到保证,所以Eureka 比ZK更适合。

接下来我们继续来使用Fegin来进行调用,使用起来更加简单

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值