LHon(学习笔记)——Eureka

本文详细介绍了微服务架构的优势和挑战,并探讨了SpringCloud作为微服务解决方案的角色。重点讲解了SpringCloud中的Eureka服务注册与发现,以及Ribbon的负载均衡功能,包括如何将服务注册到Eureka集群以及如何配置和使用Ribbon实现客户端负载。此外,还提供了Eureka集群搭建和Ribbon在实际项目中的应用示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、先谈谈微服务

微服务是一种架构模式或者说是一种架构风格,它提倡将单一应用程序分成一组小的服务,每个服务运行在其独立的进程中,服务之间互相协调、互相配合,为用户提供最终价值,服务之间采用轻量级的通信机制互相沟通(通常是基于HTTP的RESTful API,而Dubbo是采用了RPC作为通信机制,即远程过程调用协议),每个服务都围绕着具体的业务进行构建,并能够独立地部署到生产环境、类生产环境等,而且还可以使用不同的开发语言来编写各个服务,或是使用不同的数据存储技术。

简而言之:微服务就是将传统的一站式服务拆分为一个一个的服务,每个服务提供单个业务功能,也就是一个服务做一件事,彻底去耦合。

下面来一张 Martin Fowler个人博客上的图片,左边是整体,右边是微服务。可以看出,传统的一站式服务每次有更改都会重新部署整个服务,有很强的连坐概念,而微服务的每个模块之间互不影响,只需要部署有更改的某个业务所对应的服务即可。
左边是整体,右边是微服务

1.微服务的优点
  • 每个服务足够内聚、足够小;
  • 开发简单、效率高,每个服务可以被一个很小的团队开发;
  • 微服务是松耦合的,无论是在开发或是部署阶段都是独立的,每个服务又可以使用不同的开发语言或是不同的数据存储技术;
  • 易于和第三方应用集成,易于被开发人员理解、修改和维护;
  • 微服务只是业务逻辑的代码,不会和界面组件混合开发。
2.当然 有优点也有缺点
  • 开发人员需要处理分布式系统的复杂性;
  • 随着服务的增加,运维的压力随之增加;
  • 系统部署依赖,服务间的通信成本,数据一致性。
3.微服务技术栈
微服务相关技术
服务开发Spring Boot、Spring、SpringMVC
服务配置与管理Netflix公司的Archaius、阿里的Diamond等
服务注册与发现Eureka、Consul、zookeeper等
服务调用Rest、RPC、gRPC
负载均衡Ribbon、Nginx
服务接口调用(客户端调用服务的简化工具)Feign等
消息队列Kafka、RabbitMQ、ActiveMQ等
服务配置中心管理Spring Cloud Config、Chef等
服务路由(API网关)Zuul等
全链路追踪Zipkin、Brave、Dapper等
服务部署Docker、OpenStack等
数据流操作开发包Spring Cloud Stream
事件消息总线Spring Cloud Bus

由此可见,微服务技术栈内容繁多!于是~

二、微服务解决方案——Spring Cloud

Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙的简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring并没有开发什么新的东西,它只是将各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。 该内容参考文章 来自一个大佬对Spring Cloud的讲解 个人觉得这篇文章写得很好。

用一句话来说:Spring Cloud就是上面微服务技术栈里那些相关技术的有序集合,它是微服务架构下的一站式解决方案,俗称微服务全家桶。

1.Spring Boot和Spring Cloud的关系
  • Spring Boot专注于快速方便的开发单个个体服务;
  • Spring Cloud是关注全局的微服务协调治理框架,它将Spring Boot开发的一个个单体微服务整合并管理起来,为各个微服务之间提供集成服务;
  • Spring Boot可以离开Spring Cloud独立使用开发项目,但是Spring Cloud离不开Spring Boot,属于依赖关系。
2.Spring Cloud核心子项目
  • Spring Cloud Netflix:核心组件,包括Eureka(服务治理组件,包含服务注册与发现)、Ribbon(客户端负载均衡的服务调用组件)、Feign(基于Ribbon和Hystrix的声明式服务调用组件)、Hystrix(容错管理组件,实现了熔断器)、Zuul(网关组件,提供智能路由、访问过滤等功能)、Archaius(外部化配置组件);
  • Spring Cloud Config:配置管理工具,实现应用配置的外部化存储,支持;
  • Spring Cloud Bus:事件、消息总线,用于传播集群中的状态变化或事件,以及触发后续的处理;
  • Spring Cloud Security:基于spring security的安全工具包,为我们的应用程序添加安全控制;
  • Spring Cloud Consul:封装了Consul操作,Consul是一个服务发现与配置工具(与Eureka作用类似),与Docker容器可以无缝集成;
  • 。。。。。。
3.Spring Cloud Netflix:Eureka服务注册与发现

Eureka可以说是Spring Cloud的门神,它是Spring Cloud Netflix(据说是一个视频公司,由于访问量很大,自己开发了一套微服务架构,后来他们将这套微服务架构开源了)的一个组件,也是核心模块之一。Eureka是一个基于REST的服务,用于定位服务,以实现云端中间层服务发现和故障转移。服务注册与发现对于微服务架构来说是非常重要的,有了服务注册与发现,只需要使用服务的标识符,就可以访问到服务,而不需要修改服务调用的配置文件了。其功能类似于dubbo的注册中心Zookeeper。

Eureka的设计遵循AP原则,其主要架构思路:采用CS设计架构,Eureka Server作为服务注册中心,系统中的其它微服务,通过Eureka的客户端连接到Eureka Server并维持心跳连接,系统的维护人员可以通过Eureka Server来监控系统中的各个微服务是否正常运行。
Eureka原理
每个微服务节点启动后,都会在Eureka Server中进行注册,所以Eureka Server的服务注册表中存储着所有可用节点的信息,节点信息都可以在界面中直观看到。

Eureka Client是一个Java客户端,用于简化Eureka Server的交互,同时在应用启动后将会周期性的向Eureka Server发送心跳(默认30s,内置的,使用轮询负载算法的负载均衡器),如果Eureka在多个时间周期没有收到某个节点的心跳,将会从服务注册表中将这个服务节点移除(默认90s)。

a.将Eureka引入到项目中去

这个项目构建过程参考我的另一篇笔记使用IDEA构建多模块项目,废话就不多说了,直接开始整!

和上一篇笔记一样的方式,新建一个Module,取名为microservice-eureka,在resources下创建application.yml,其内容如下:

server:
  port: 7001

eureka:
  instance:
    hostname: localhost #服务端实例名称
  client:
    register-with-eureka: false #不向自己注册自己,自己注册了自己的话 运行的时候可能会报下面的异常
    fetch-registry: false #表示自己就是注册中心
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka #注册与发现服务所依赖的地址

jersey.api.client.ClientHandlerException: java.net.ConnectException: Connection refused (Connection refused)

新增SpringBoot启动类

package com.mezjh.cloud;

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

/**
 * @author zjh
 * @date 2019/11/28
 */
@SpringBootApplication
/**
 * 开启Eureka server
 */
@EnableEurekaServer
public class EurekaStarter {
    public static void main(String[] args) {
        SpringApplication.run(EurekaStarter.class, args);
    }
}

直接启动来看看效果吧,至于到底有没有启动成功,可以像Tomcat一样,访问上述端口,可以看到下面这张图片,代表已经成功了:
在这里插入图片描述
接下来修改microservice-provider里面的内容,把它注册到Eureka里面,首先引入maven依赖,

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            <version>1.4.6.RELEASE</version>
        </dependency>

引入这个maven依赖之后,需要删除之前的spring-boot-starter包,不然运行的时候会报错,引入jar包之后,在application.yml里面添加以下代码

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:7001/eureka

这表示它要将自己注册到哪里去,就是上面我们新建的那个Module,在SpringBoot启动类上面增加以下注解,代表它是Eureka客户端

@EnableEurekaClient

接下来运行microservice-eureka和microservice-provider,再访问http://localhost:7001/的时候,看下图
在这里插入图片描述
图中可以看到此时多了一个MICROSERVICE-PRO服务,它的名字的由来其实就是application.yml配置文件里面的spring.application.name

在这里插入图片描述

b.Eureka集群的搭建

这里和microservice-eureka步骤一样,分别创建microservice-eureka02、microservice-eureka03。
修改主机hosts文件,添加下列内容:

127.0.0.1 mezjh1
127.0.0.1 mezjh2
127.0.0.1 mezjh3

将microservice-eureka的application.yml修改成如下,02和03也是如下配置,将每一个Eureka指定其它两个Eureka Server:

server:
  port: 7001
  context-path: /eureka

eureka:
  instance:
    hostname: mezjh1 #服务端实例名称
  client:
    register-with-eureka: false #不向自己注册自己
    fetch-registry: false  #表示自己就是注册中心
    serviceUrl:
      defaultZone: http://mezjh2:7002/eureka,http://mezjh3:7003/eureka
      #defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka #注册与发现服务所依赖的地址

4.Spring Cloud Netflix:Ribbon负载均衡

Ribbon也是Netflix的一个组件,是一套客户端负载均衡的工具,它主要是提供客户端的负载均衡算法,将Netflix的中间层服务连接在一起,Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。简单来说,就是在配置文件中列出Load Balancer(负载均衡,简称LB,它是微服务或分布式集群中经常用的一种应用,可以将用户的请求平摊的分配到多个服务上,从而达到系统的高可用)后面所有的机器,Ribbon会自动基于某些规则(如简单连接、随机轮询等)去连接这些机器,我们也很容易使用Ribbon去实现自定义的负载均衡算法。

a.将Ribbon引入到项目

Ribbon既然是一套客户端的负载均衡工具,那么我们需要在microservice-customer中的pom添加如下依赖

  		 <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
            <version>1.3.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-ribbon</artifactId>
            <version>1.3.5.RELEASE</version>
       </dependency>

修改application.yml文件

server:
  port: 80
  servlet:
    context-path: /microservice-cus
eureka:
  client:
    register-with-eureka: false #自己不能注册
    service-url:
      defaultZone: http://mezjh1:7001/eureka,http://mezjh2:7002/eureka,http://mezjh3:7003/eureka #Eureka集群

这时打开CustomerController这个类,发现它是用restTemplate在干活,我们此刻要让它在干活的时候自带负载均衡效果,这个时候打开它的BeanConfig,加上注解@LoadBalanced,该类当前如下:

package com.mezjh.cloud.config;

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

/**
 * @author zjh
 * @date 2019/11/28
 */
@Configuration
public class BeanConfig {

    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
}

客户端本身需要与Eureka整合,于是在它主启动类上添加注解@EnableEurekaClient,修改CustomerController的请求地址为微服务的名字,让它此时在访问微服务。

private static final String REQUEST_URL_PREFIX = "http://MICROSERVICE-PRO";

最后,我们来测试一下代码,依次启动每一个微服务…待续

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值