前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring Cloud学习(1)——单节点Eureka Server

Spring Cloud学习(1)——单节点Eureka Server

作者头像
胡了了
发布2019-05-29 11:47:14
6480
发布2019-05-29 11:47:14
举报

阅读的书籍为《Spring Cloud 微服务实战》。

基本概念

服务治理

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

早期微服务系统中,服务不多,可以通过静态配置来完成服务的调用。但是随着业务的发展,系统功能越来越复杂,相应的微服务应用也不断增加,静态配置就越来越难以维护,故需要实现微服务实例的自动化注册与发现

服务注册

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

服务发现

在服务治理框架下运作,服务间的调用不再通过指定具体的实例地址来实现,而是通过向服务名发起请求调用实现。

Eureka服务端

即为服务注册中心。 如果以集群模式部署,当集群中有分片出现故障时,Eureka就会转入自我保护模式。它允许在分片故障期间继续提供服务的发现与注册,当故障分片恢复运行的时候,集群中的其他分片会把它们的状态再次同步回来。 不同可用区域的服务注册中心通过异步模式互相复制各自的状态,这意味着任意给定的时间点,每个实例关于所有服务的状态是有细微差别的

Eureka客户端

主要处理服务的注册与发现,在应用程序运行时,客户端向注册中心注册自身提供的服务并周期性地发送心跳来更新它的服务租约。 同时它也能从服务端查询当前注册的服务信息,并把它们缓存到本地并周期性地刷新服务状态。

搭建服务注册中心

  • 使用IDEA搭建一个基础的Spring Boot工程,在pom.xml中引入Eureka必要的依赖内容。
  • 通过@EnableEurekaServer注解启动一个服务注册中心。如下:
代码语言:javascript
复制
@EnableEurekaServer
@SpringBootApplication
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}
  • 在默认设置下,该服务注册中心也会将自己作为客户端来尝试注册它自己,需要禁用它的客户端注册行为。在application.properties中增加如下配置:
代码语言:javascript
复制
server.port=1111
eureka.instance.hostname=localhost
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/
#关闭保护机制
eureka.server.enable-self-preservation=false

eureka.client.register-with-eureka设置为false代表不向注册中心注册自己。 eureka.client.fetch-registry设置为false,代表不需要去检索服务。 eureka.server.enable-self-preservation=false,代表关闭保护机制。

Eureka会因为15分钟内超过85%的实例丢失心跳而触发保护机制,触发保护机制后,Eureka Server会将当前实例注册信息保护起来,让这些实例不会过期。但在保护期内,可能实例出现了问题,那么客户端就很容易拿到实际已经不存在的实例,出现调用失败的情况。生产环境,需要客户端有容错机制,比如请求重试、断路器等。在此,本地调试时关闭保护机制,确保注册中心可以将不可用的实例正确剔除。

这里写图片描述
这里写图片描述

其中Instances currently registered with Eureka栏为空,说明该注册中心还没有注册任何服务。

注册服务提供者

  • 使用IDEA重新搭建一个基础的Spring Boot工程,在pom.xml中引入Eureka必要的依赖内容。
  • 主类中加上@EnableDiscoveryClient注解,激活Eureka中的DiscoveryClient实现。
代码语言:javascript
复制
package com.example.helloworld;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class HelloworldApplication {
    public static void main(String[] args) {
        SpringApplication.run(HelloworldApplication.class, args);
    }
}
  • 在该工程的主类同级目录下创建一个RESTful API实现代码。通过注入DiscoveryClient对象,在日志中打印出服务的相关内容。
代码语言:javascript
复制
package com.example.helloworld.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.apache.log4j.Logger;
import java.util.List;
@RestController
public class HelloworldController {
    private final Logger log = Logger.getLogger(getClass());
    @Autowired
    private DiscoveryClient discoveryClient;
    @RequestMapping(value = "/helloworld", method = RequestMethod.GET)
    public String helloworld() {
        System.out.println("discoveryClient.getServices().size() = " + discoveryClient.getServices().size());
        for (String s : discoveryClient.getServices()) {
            System.out.println("services " + s);
            List<ServiceInstance> serviceInstances = discoveryClient.getInstances(s);
            for (ServiceInstance si : serviceInstances) {
                System.out.println("    services:" + s + ":getHost()=" + si.getHost());
                System.out.println("    services:" + s + ":getPort()=" + si.getPort());
                System.out.println("    services:" + s + ":getServiceId()=" + si.getServiceId());
                System.out.println("    services:" + s + ":getUri()=" + si.getUri());
                System.out.println("    services:" + s + ":getMetadata()=" + si.getMetadata());
            }
        }
        return "hello world";
    }
}
  • 在application.properties中增加如下配置:
代码语言:javascript
复制
spring.application.name=hello-world-service
eureka.client.serviceUrl.defaultZone=http://localhost:1111/eureka/
  • 启动服务

可以在该服务的控制台看到如下输出:

这里写图片描述
这里写图片描述

可以在服务注册中心的控制台看到如下输出:

这里写图片描述
这里写图片描述

访问Eureka的信息面板

这里写图片描述
这里写图片描述

可以在注册服务的控制台查看到它从服务注册中心获取到的服务相关信息。

这里写图片描述
这里写图片描述
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年02月24日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 基本概念
    • 服务治理
      • 服务注册
      • 服务发现
      • Eureka服务端
      • Eureka客户端
  • 搭建服务注册中心
  • 注册服务提供者
相关产品与服务
微服务引擎 TSE
微服务引擎(Tencent Cloud Service Engine)提供开箱即用的云上全场景微服务解决方案。支持开源增强的云原生注册配置中心(Zookeeper、Nacos 和 Apollo),北极星网格(腾讯自研并开源的 PolarisMesh)、云原生 API 网关(Kong)以及微服务应用托管的弹性微服务平台。微服务引擎完全兼容开源版本的使用方式,在功能、可用性和可运维性等多个方面进行增强。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档