SpringCloud——服务治理中心Eureka

微服务架构经过业务划分后,服务细化,多个服务之间互相调用,链层调用,调用与调用之间的关系越来越困难,需要一个工具来进行统一管理。Eureka是Netflix开源的一款提供服务注册和发现的产品,它提供了完整的Service Registry和Service Discovery实现。也是springcloud体系中最重要最核心的组件之一。

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



Eureka由两个组件组成:Eureka服务器和Eureka客户端。Eureka服务器用作服务注册服务器。Eureka客户端是一个java客户端,用来简化与服务器的交互、作为轮询负载均衡器,并提供服务的故障切换支持。

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

  1. Eureka Server :提供服务注册和发现
  2. Service Provider : 服务提供方,将自身服务注册到Eureka,从而使服务消费方能够找到
  3. Service Consumer : 服务消费方,从Eureka获取注册服务列表,从而能够消费服务

现有服务消费方A和服务提供方B,为服务AB提供服务注册中心eureka。


Eureka 单机部署

  1. pom.xml
       <!--eureka-server-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
        <!--boot web actuator-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
  1. application.yml
server:
  port: 7001

eureka:
  instance:
    hostname: localhost #eureka服务端的实例名称
  client:
    #在默认设置下,该服务注册中心也会将自己作为客户端来尝试注册它自己,所以我们需要禁用它的客户端注册行为
    register-with-eureka: false     #表示是否将自己注册到Eureka Server,默认为true。
    fetch-registry: false
    #表示是否从Eureka Server获取注册信息,默认为true,false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
    service-url:
      defaultZone: http://localhost:${server.port}/eureka/
    #设置与Eureka Server交互的地址,查询服务和注册服务都需要依赖这个地址。默认是http://localhost:8761/eureka ;多个地址可使用 , 分隔。

3.启动类添加注解

@SpringBootApplication
@EnableEurekaServer
public class EurekaMain7001 {
    public static void main(String[] args) {
        SpringApplication.run(EurekaMain7001.class,args);
    }
}

启动工程后,访问:http://localhost:7001/,可以看到下面的页面,其中还没有发现任何服务

集群部署

在一个分布式系统中,服务注册中心是最重要的基础部分,理应随时处于可以提供服务的状态。为了维持其可用性,使用集群是很好的解决方案。Eureka通过互相注册的方式来实现高可用的部署,所以我们只需要将Eureke Server配置其他可用的serviceUrl就能实现高可用部署。


双节点注册中心

此时创建两个eureka模块。

  1. pom文件上同
  2. application.yml和单机不同 ,要进行相互注册

server1:

server:
  port: 7001
eureka:
  instance:
    hostname: eureka7001.com
  client:
    register-with-eureka: false
    fetch-registry: false
    service-url:
      defaultZone: http://eureka7002.com:7002/eureka/

server2:

server:
  port: 7002
eureka:
  instance:
    hostname: eureka7002.com
  client:
    register-with-eureka: false
    fetch-registry: false
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka/
  1. host转换
127.0.0.1 eureka7001.com
127.0.0.1 eureka7002.com


启动两个实例。

DS Replicas已经有了另一个实例的相关配置信息。当时用多个节点的时候,只需要进行互相注册即可。例如A、B、C三个节点,A要注册到B、C,B要注册到A、C,C要注册到A、B即可。

服务注册

注册中心搭建好了,下面进行服务的注册。

现有服务提供方B,向服务中心进行注册。

  1. pom
        <!--eureka-client-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
  1. application.yml
server:
  port: 8001
spring:
  application:
    name: cloud-payment-service
eureka:
  client:
    register-with-eureka: true #是否将自己注册进eureka,默认为true
    fetch-registry: true
    service-url:
      defaultZone : http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/
  instance:
    prefer-ip-address: true   # 不配置true注册中心显示的是主机名+applicationName+端口号,否则显示  instance-id 值
    instance-id: payment8001

3,启动类添加注解

    @SpringBootApplication
@EnableEurekaClient
public class PayMentMain8001 {
    public static void main(String[] args) {
        SpringApplication.run(PayMentMain8001.class,args);
    }
}
  1. 服务提供
    @Value("${server.port}")
    private String serverPort;

    @GetMapping("/payment/get/{id}")
    public CommonResult<Payment> getPaymentById (@PathVariable("id") Long id ) {
          return new CommonResult(200,"调用成功 port :" + serverPort,id);
    }

此时服务提供方就被注册到注册中心了。

服务发现

  1. pom
        <!--eureka-client-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
eureka:
  client:
    register-with-eureka: true #是否将自己注册进eureka,默认为true
    fetch-registry: true # 是否从eureka抓取已有的注册信息,默认为true,单节点无所谓,集群下必须设置为true才能配合rubbion使用负载均衡
    service-url:
      defaultZone : http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/
  instance:
    prefer-ip-address: true
    instance-id: order80

3,启动类添加注解

@SpringBootApplication
@EnableEurekaClient
public class OrderMain80 {
    public static void main(String[] args) {
        SpringApplication.run(OrderMain80.class,args);
    }
}
  1. 服务调用
@RestController
@Slf4j
public class OrderController {
    //服务调用方applicationname
    private static final String PAYMENT_URL= "http://cloud-payment-service";

    @Resource
    private RestTemplate restTemplate;

    @GetMapping("/consumer/payment/get/{id}")
    public CommonResult<Payment> getPayment(@PathVariable("id")Long id){
        return restTemplate.getForObject(PAYMENT_URL + "/payment/get/" + id,CommonResult.class);
    }
}

5.Feign调用实现

@FeignClient(name= "cloud-payment-service")
public interface HelloRemote {
    @RequestMapping(value = "/payment/get/{id}")
    public CommonResult<Payment> getPayment(@PathVariable("id")Long id);
}
  • name:远程服务名,及spring.application.name配置的名称.
  • 此类中的方法和远程服务中contoller中的方法名和参数需保持一致。

将HelloRemote注入到controller层,像普通方法一样去调用即可。

@RestController
public class ConsumerController {

    @Autowired
    HelloRemote HelloRemote;

    @RequestMapping(value = "/consumer/payment/get/{id}")
    public String getPayment(@PathVariable("id")Long id){
        return HelloRemote.getPayment(id);
    }
}

负载均衡

以上面cloud-payment-service为例子修改,将其中的controller改动如下:

    @Value("${server.port}")
    private String serverPort;

    @GetMapping("/payment/get/{id}")
    public CommonResult<Payment> getPaymentById (@PathVariable("id") Long id ) {
          return new CommonResult(200,"调用成功 port :" + serverPort,id);
    }

在配置文件中改动端口:

server.port=8002

启动后,在eureka就会发现两个服务提供者.然后在浏览器再次输入:http://localhost//consumer/payment/get/1 进行测试:

第一次返回结果:调用成功 port : 8001...

第二次返回结果:调用成功 port : 8002...

不断的进行测试下去会发现两种结果交替出现,说明两个服务中心自动提供了服务均衡负载的功能。如果我们将服务提供者的数量在提高为N个,测试结果一样,请求会自动轮询到每个服务端来处理。

原文地址:https://www.cnblogs.com/luckyhui28/p/12546128.html

时间: 2024-10-08 06:28:59

SpringCloud——服务治理中心Eureka的相关文章

SpringCloud——服务治理机制笔记

SpringCloud--服务治理机制笔记 服务治理机制 服务提供者 服务注册服务提供者 在启动的时候会通过发送REST请求的方式将自己注册到Eureka Server上,同时带上了自身服务的一些元数据信息. eureka.client.register-with-eureka=true:启动注册操作 服务同步 服务续约 eureka.instance.lease-renewal-interval-in-seconds=30:用于定义服务续约任务的调用间隔时间,默认30秒eureka.insta

浅谈微服务架构与服务治理的Eureka和Dubbo

前言 本来计划周五+周末三天自驾游,谁知人算不如天算,周六恰逢台风来袭,湖州附近的景点全部关停,不得已只能周五玩完之后,于周六踩着台风的边缘逃回上海.周末过得如此艰难,这次就聊点务虚的话题,一是浅谈微服务的架构设计,二是聊聊微服务中广泛用于服务治理的Eureka与RPC框架Dubbo异同点. 一.微服务的架构设计 之所以想聊一下这个话题,主要有感于最近接触的两个新的微服务项目--两个项目的架构设计出自两个人之手,却不约而同的使用了相同的设计理念,项目结构非常类似.又想到就职于上家公司时接触到的项

spring cloud(二)服务(注册)中心Eureka

Eureka是Netflix开源的一款提供服务注册和发现的产品,它提供了完整的Service Registry和Service Discovery实现.也是springcloud体系中最重要最核心的组件之一. 背景介绍 服务中心 服务中心又称注册中心,管理各种服务功能包括服务的注册.发现.熔断.负载.降级等,比如dubbo admin后台的各种功能. 有了服务中心调用关系会有什么变化,画几个简图来帮忙理解 项目A调用项目B 正常调用项目A请求项目B 有了服务中心之后,任何一个服务都不能直接去掉用

SpringCloud服务发现注册Eureka +Ribbon + Feign

在本期将学习以下知识点: 什么是服务注册和发现? 基于Eureka的注册服务器 服务生产者 结合Ribbon服务消费者 结合Feign的服务生产者和消费者 什么是服务注册和发现 假设有2个微服务A和B分别在端点http:// localhost:8181 /和http:// localhost:8282 /上运行,如果想要在A服务中调用B服务,那么我们需要在A服务中键入B服务的url,这个url是负载均衡器分配给我们的,包括负载平衡后的IP地址,那么很显然,B服务与这个URL硬编码耦合在一起了,

SpringCloud服务配置中心

SpringCloud Config简介 Spring Cloud Config 是 Spring Cloud 团队创建的一个全新项目,用来为分布式系统中的基础设施和微服务应用提供集中化的外部配置支持,它分为服务端与客户端两个部分.其中服务端也称为分布式配置中心,它是一个独立的微服务应用,用来连接配置仓库并为客户端提供获取配置信息.加密 / 解密信息等访问接口:而客户端则是微服务架构中的各个微服务应用或基础设施,它们通过指定的配置中心来管理应用资源与业务相关的配置内容,并在启动的时候从配置中心获

SpringCloud 服务注册中心 服务提供者 服务消费者

1. 建立"服务注册中心" 创建一个基础的Spring Boot工程,并在pom.xml中引入需要的依赖内容: <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> </dependency> 在主类中通过@EnableEurekaSe

使用Zookeeper搭建服务治理中心

Zookeeper是Apache Hadoop的子项目,是一个树形的目录服务,支持变更推送,适合作为Dubbo服务的注册中心,工业强度较高,推荐生成环境使用. , 下面结合上图介绍Zookeeper在服务注册与发现里面的应用: 如上图整体Zookeeper的树根Root是Dubbo,说明建立的Zookeeper分组为Dubbo,树的第二层为Service层用来表示具体的接口服务,这里为com.test.UserServiceBo接口服务,树的第三层为Type层用来区分是服务提供者,还是服务消费者

SpringCloud之注册中心Eureka搭建

POM: <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.2.RELEASE</version> </parent> <dependencyManagement> <dependencies> <

一、服务治理:Spring Cloud Eureka

核心内容: 构建服务注册中心 服务注册于服务发现 Eureka的基础架构 Eureka的服务治理机制 Eureka的配置 服务治理:主要是用来实现各个微服务实例的自动化注册与发现 服务注册:在服务治理框架中,通常会构建一个注册中心,每个服务单元向注册中心登记自己的提供的服务,将主机与端口号.版本号.通信协议等一些信息告诉给注册中心,注册中心按服务名分类组织服务清单. eg: 另外,服务注册中心还需要以心跳的方式去监测清单中的服务是否可用,若不可用需要从服务清单中踢出 服务发现:由于在服务治理框架