springcloud-Eureka

一、概论

我们知道微服务是把一个大项目拆分成多个模块,各模块间相互调用就会出现各种各样的问题,而SpringCloud提供了一整套的解决方案。

SpringCloud的基础功能:

  • 服务治理: Spring Cloud Eureka
  • 客户端负载均衡: Spring Cloud Ribbon
  • 服务容错保护: Spring Cloud Hystrix
  • 声明式服务调用: Spring Cloud FeignAPI
  • 网关服务:Spring Cloud Zuul
  • 分布式配置中心: Spring Cloud Config

二、Eureka

2.1 引出

那会出现什么问题呢??首当其冲的就是子系统之间的通讯问题。子系统与子系统之间不是在同一个环境下,那就需要远程调用。既然是远程调用,就必须知道ip地址,服务间通过显示ip地址相互调用。
场景:A服务调用B服务,B服务调用C服务,C服务调用D服务
在A服务的代码里面调用B服务,显式通过IP地址调用:http://123.123.123.123:8888/java3y/3,(同样地)B->C,C->D

这是又会产生一个问题:如果某服务的ip地址变了,需要在每个服务中手动更新调用服务的地址!非常麻烦!

为了解决微服务架构中的服务实例维护问题(ip地址), 产生了大量的服务治理框架和产品。
这些框架和产品的实现都围绕着服务注册服务发现机制来完成对微服务应用实例的自动化管理

在SpringCloud中我们的服务治理框架一般使用的就是Eureka。

2.2 Eureka细节

注册清单
代码中通过服务名找到对应的IP地址

在这里插入图片描述
Eureka专门用于给其他服务注册的称为Eureka Server(服务注册中心),其余注册到Eureka Server的服务称为Eureka Client。

2.3 Eureka的治理机制

  • 服务提供者
    服务注册:启动的时候会通过发送REST请求的方式将自己注册到Eureka Server上,同时带上了自身服务的一些元数据信息。
    服务续约:在注册完服务之后,服务提供者会维护一个心跳用来持续告诉Eureka Server: "我还活着 ” 。
    服务下线:当服务实例进行正常的关闭操作时,它会触发一个服务下线的REST请求给Eureka Server, 告诉服务注册中心:“我要下线了 ”。

  • 服务消费者
    获取服务:当我们启动服务消费者的时候,它会发送一个REST请求给服务注册中心,来获取上面注册的服务清单
    服务调用:服务消费者在获取服务清单后,通过服务名可以获得具体提供服务的实例名和该实例的元数据信息。在进行服务调用的时,优先访问同处一个Zone中的服务提供方

  • Eureka Server(服务注册中心)
    失效剔除:默认每隔一段时间(默认为60秒) 将当前清单中超时(默认为90秒)没有续约的服务剔除出去。
    自我保护:EurekaServer 在运行期间,会统计心跳失败的比例在15分钟之内是否低于85%(通常由于网络不稳定导致)。 Eureka Server会将当前的实例注册信息保护起来, 让这些实例不会过期,尽可能保护这些注册信息

在这里插入图片描述

三、引出RestTemplate和Ribbon

通过Eureka服务治理框架,我们可以通过服务名来获取具体的服务实例的位置了(IP)。一般在使用SpringCloud的时候不需要自己手动创建HttpClient来进行远程调用。

可以使用Spring封装好的RestTemplate工具类,使用起来很简单:

    //传统的方式,直接显示写死IP是不好的!
    //private static final String REST_URL_PREFIX = "http://localhost:8001";
	
	// 服务实例名
    private static final String REST_URL_PREFIX = "http://MICROSERVICECLOUD-DEPT";

    /**
     * 使用 使用restTemplate访问restful接口非常的简单粗暴无脑。 
     * (url, requestMap,ResponseBean.class)这三个参数分别代表 REST请求地址、请求参数、HTTP响应转换被转换成的对象类型。
     */
    @Autowired
    private RestTemplate restTemplate;

    @RequestMapping(value = "/consumer/dept/add")
    public boolean add(Dept dept) {
        return restTemplate.postForObject(REST_URL_PREFIX + "/dept/add", dept, Boolean.class);
    }

为了实现服务的高可用,我们可以将服务提供者集群。比如说,现在一个秒杀系统设计出来了,准备上线了。在11月11号时为了能够支持高并发,我们开多台机器来支持并发量。
现在想要这三个秒杀系统合理摊分用户的请求(专业来说就是负载均衡),可能你会想到nginx。
其实SpringCloud也支持的负载均衡功能,只不过它是客户端的负载均衡,这个功能实现就是Ribbon!

负载均衡又区分了两种类型

  • 客户端负载均衡(Ribbon):

服务实例的清单在客户端,客户端进行负载均衡算法分配。(从上面的知识我们已经知道了:客户端可以从Eureka Server中得到一份服务清单,在发送请求时通过负载均衡算法,在多个服务器之间选择一个进行访问)

  • 服务端负载均衡(Nginx):

服务实例的清单在服务端,服务器进行负载均衡算法分配。

转载自:https://www.zhihu.com/question/283286745/answer/763040709

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值