springcloud五大神兽之Eureka介绍

一、springcloud简介
1.0 什么是微服务?
① 业务角度
从业务角度分析,就是将整体项目(传统的一站式应用)按照业务拆分,将每个业务拆分为一个个独立的服务,彻底解除业务模块之间的耦合,每个微服务单独提供单个业务功能,一个服务只做一件事。
② 技术角度
就是一种小而独立的处理过程,类似进程的概念,能够自行单独启动或销毁,可以拥有自己独立的数据库。
③ 微服务优缺点
优点:
1.每个服务足够内聚,足够小,代码容易理解。这样能聚焦一个业务功能或业务需求。
2.开发简单、开发效率提高,一个服务可能就是专业的只干一件事,微服务能够被小团队单独开发,这个小团队可以是2到5人的开发人员组成。
3.微服务是松耦合的,是有功能意义的服务,无论是在开发阶段或部署阶段都是独立的。
4.微服务能使用不同的语言开发。
5.易于和第三方集成,微服务运行容易且灵活的方式集成自动部署。
6.微服务易于被一个开发人员理解、修改和维护,这样小团队能够更关注自己的工作成果,无需通过合作才能体现价值。
7.微服务允许你利用融合最新技术。微服务只是业务逻辑的代码,不会和HTML/CSS或其他界面组件混合,即前后端分离。
8.每个微服务都有自己的存储能力,可以有自己的数据库,也可以有统一数据库。
缺点:
开发人员要处理分布式系统的复杂性。
④ 服务演变
微服务架构是在SOA架构基础上演变而来的,粒度上比soa架构更加精细,微服务架构更加体现”专人干专事”,目的是提高开发效率。每个服务之间互不影响(原子性),每个服务都必须独立部署(独立mysql、redis、消息队列等)。服务之间通过rest风格进行通信(即使用HTTP协议+json格式进行数据的传输)。
⑤ 微服务和SOA服务区别?
(1)微服务架构基于SOA架构演变过来,继承SOA架构的优点,在微服务架构中去除SOA架构中的ESB消息总线,采用http+json(restful)进行传输。
(2)、微服务架构对比SOA架构粒度会更加精细,让专业的人干专业的事情,目的是为了提高效率,每个服务于服务之间互不影响。在微服务架构中,每个服务必须独立部署,微服务架构更加轻巧、轻量。
(3)、SOA架构中可能数据库存储会发生共享,微服务强调每个服务都有独立数据库,保证每个服务于服务之间互不影响。
(4)、项目体现特征,微服务架构比SOA架构更加适合于互联网公司的敏捷开发、快速迭代版本。
1.1 什么是springcloud?
Springcloud是一系列框架的有序集合,它是由spring框架组合的,内部的框架都是各家公司开发的比较成熟、经得起实际考验的服务框架,它通过 Spring Boot风格进行再封装、屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具集。
1.2 Springcloud设计目的?
基于springboot框架,给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。
1.3 Springcloud核心组件?
Springcloud是一系列框架的有序集合,内部封装了很多实用性的框架,其中使用最多的是下面5个框架,也称为springcloud的五大神兽。
服务发现框架——Netflix Eureka
客服端负载均衡——Netflix Ribbon
断路器——Netflix Hystrix
服务网关——Netflix Zuul
分布式配置——Spring Cloud Config
二、springcloud五大神兽之Eureka介绍
2.1 Eureka
① Eureka是什么?
Eureka是springcloud中的服务发现框架(服务注册中心),在前后端分离框架中,服务层被拆分成多个微服务,这些微服务之间的通信信息和依赖也需要组件来管理,而eureka可以帮助我们来维护各微服务之间的关系。
② 为什么需要Eureka?
(1)实际项目研发中,微服务数量众多,各微服务之间的通信需要进行远程调用,那么调用过程中就需要明确这些微服务各自的ip地址和端口号,而注册中心Eureka可以帮助我们管理这些个微服务的ip和端口。
(2)使用Eureka管理微服务,微服务会实时上报自身的状态到Eureka注册中心,eureka统一管理这些微服务的状态,比如:将存在问题的服务剔出服务列表,保证各个微服务调用到的服务都是可用的。
③ Eureka做了哪些工作?
(1)服务管理
(2)服务状态监管
(3)服务的注册和发现(Eureka自动匹配服务给调用者)
(4)动态路由
④ Eureka组成
(1)Eureka注册中心(EurekaServer)
(2)服务提供者(向Eureka服务注册中心注册服务)
(3)服务消费者(向Eureka服务注册中心订阅服务)
⑤ 三者关系
在这里插入图片描述
(1)不管是服务提供者还是服务消费者,对于Eureka注册中心来讲,都是客户端
(2)注册中心(也可以是集群)对外暴露自己的地址(ip+端口)
(3)服务提供者向Eureka服务注册中心注册自己的服务信息
(4)服务消费者从Eureka订阅服务,Eureka注册中心会自动将对应服务的所有提供者地址列表发送给消费者,服务消费者会将服务列表缓存到本地,并定期更新。
2.2 Eureka案例演示
① 创建Eureka服务注册中心工程
(1)使用maven创建eureka-server工程,该工程作为服务注册中心工程
(2)在pom.xml文件中导入eureka的依赖坐标

<dependencies>
    <!--eureka-server依赖-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
</dependencies>

(3)在resource目录下,创建application.yml文件,并加入相关配置

server:
  port: 7001  #指定注册中心端口号
spring:
  application:
    name: eureka-server #引用名称,在Eureka中作为服务的id标识(serviceId),注意:该名称中不可以使用下划线
eureka:
  client:
    register-with-eureka: false #是否将自己注册到Eureka注册中心中,false表示关闭掉
    fetch-registry: false #是否从eureka注册中心中获取服务,false表示关闭掉
    service-url:
      defaultZone: http://127.0.0.1:7001/eureka  # 指定EurekaServer服务端的地址(对外暴露的ip+端口)

(4)创建该工程的启动类

@SpringBootApplication
@EnableEurekaServer //开启eureka服务,注册中心只能是Eureka
public class EurekaServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServerApplication.class,args);
    }
}
//在该启动类上加上@EnableEurekaServer注解,标注当前工程作为Eureka的服务注册中心,启动类运行后,该工程开启eureka服务,服务提供者就可以注册服务,消费者就可以订阅相关服务

② 创建Eureka服务提供者工程
(1)使用maven创建服务提供者服务(user_producer)
(2)在pom.xml文件中导入eureka客户端依赖坐标

<!--加入eureka客户端依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

(3)在resouce下创建application.yml文件,并指定注册中心地址

#配置eureka服务地址
eureka:
  client:
    service-url:
      defaultZone: http://localhost:7001/eureka

(4)创建该工程的启动类

@SpringBootApplication
@EnableDiscoveryClient //开启Eureka客户端,注册中心可以其它框架
public class UserProducerSpringBootApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserProducerSpringBootApplication.class,args);
    }
}
//在该启动类上加上@EnableDiscoveryClient,表示开启Eureka客户端,也标注当前工程为服务提供者工程,对于eureka-server工程来说也是一个客户端(提供服务的客户端)

③ 创建Eureka服务消费者工程
(1)使用maven创建服务消费者工程(user_consumer)
(2)在pom.xml文件中导入eureka客户端依赖坐标

<!--eureka客户端-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

(3)在resouce目录下创建application.yml文件,并加入相关配置

#指定eureka服务地址
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:7001/eureka

(4)创建启动类

@SpringBootApplication
@EnableDiscoveryClient
//@EnableCircuitBreaker   //开启熔断
//@EnableFeignClients(basePackages = {"com.swk.feign"})
public class UserConsumerSpringBootApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserConsumerSpringBootApplication.class,args);
    }
    @Bean
    //@LoadBalanced   //开启ribbon负载均衡,默认是轮询
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

//在该启动类上加上@EnableDiscoveryClient,表示开启Eureka客户端,也标注当前工程为服务消费者工程,对于eureka-server工程来说也是一个客户端(消费服务的客户端)。
//使用RestTemplate类(Rest的HTTP客户端模板工具类)发送请求,需要先将restTemplate对象注入到spring容器中

④ 测试
(1)分别启动注册中心工程、服务提供者工程、服务消费者工程,发送请求访问各自的服务
注册中心:
在这里插入图片描述
访问服务提供者:
在这里插入图片描述服务消费者:
在这里插入图片描述
(2)思考:消费方在使用RestTemplate类发请求时存在的问题?
在服务消费者中,我们把url地址硬编码到代码中,不方便后期维护
在服务消费者中,不清楚服务提供者的状态(user-provider有可能宕机)
服务提供者只有一个服务,即便服务提供者形成集群,服务消费者还需要自己实现负载均衡
服务提供者的如果出现故障,是否能够及时发现
⑤ 解决url硬编码问题
(1)在服务消费方的UserController中注入DiscoveryClient对象

@RequestMapping("/consumer")
@RestController
public class UserController {
@Autowired
RestTemplate restTemplate;
@Autowired
DiscoveryClient discoveryClient;
@GetMapping(value = "/{id}")
public User queryById(@PathVariable("id") Integer id){

   /* String url = "http://localhost:8081/user/find/" + id ;
    return restTemplate.getForObject(url,User.class);*/

    //基于DiscoveryClient对象来访问
//获取指定服务名称的实例
    List<ServiceInstance> userProducer = discoveryClient.getInstances("user-producer");
//获取第一个实例
    ServiceInstance serviceInstance = userProducer.get(0);
//拼接提供者服务地址,更加灵活
    String url = "http://" + serviceInstance.getHost()+":"+serviceInstance.getPort() + "/user/find/" + id;
    return restTemplate.getForObject(url,User.class);
    //基于服务名称来访问
    /*String url = "http://user-producer/user/find/"+id;
    return restTemplate.getForObject(url,User.class);*/
}
}
//DiscoveryClient 对象是由springcloud框架提供的,用于发现(获取)当前注册中心中的服务对象,注册中心可能是集群,所以返回的是一个集合
//将DiscoveryClient 对象注入到当前UserController中,根据服务名称获取

⑥ 使用IP访问配置
在服务提供方的application.yml文件中加入instance相关配置

#配置eureka服务地址
eureka:
  client:
    service-url:
      defaultZone: http://localhost:7001/eureka
    #每隔30s获取服务中心列表一次(只读备份)
    #registry-fetch-interval-seconds: 30
  instance:
    #指定ip地址访问
    ip-address: 127.0.0.1
    #访问服务时,推荐使用ip
    prefer-ip-address: true

在这里插入图片描述
⑦ 客户端~服务续约
服务续约是服务提供者的操作;
前面我们说对于EurekaServer注册中心来说,服务提供者和服务消费者都是客户端。
(1)对于EurekaClient(客户端)来说,它会每隔30秒发送一次心跳给EurekaServer注册中心来完成续约。通过续约来告知 EurekaServer 注册中心该 Eureka Client 运行正常,没有出现问题。
(2)默认情况下,如果 Eureka Server 在 90 秒内没有收到 Eureka Client 的续约(续约到期),EurekaServer注册中心端会将该服务的实例从其注册表中删除,此时间可配置,一般情况不建议更改。
服务续约配置:

instance:
  #指定ip地址访问
  ip-address: 127.0.0.1
  #访问服务时,推荐使用ip
  prefer-ip-address: true
  #租约到期,服务有效时间,默认值90s
  lease-expiration-duration-in-seconds: 90
  #租约续约间隔时间,默认30s
  lease-renewal-interval-in-seconds: 30

⑧ 客户端~获取服务
获取服务是服务消费者的基础;
(1)服务消费者EurekaClient在调用服务时,会先从EurekaServer注册中心获取服务注册表信息,如果EurekaClient没有缓存服务注册表信息,会从EurekaServer获取最新的服务注册表(读取备份),并将其缓存在本地。消费方使用获取到的信息查找对应的服务,然后进行远程服务调用。
(2)默认情况下EurekaClient 使用压缩JSON格式来获取服务注册列表的信息。
(3)EurekaClient每隔30秒重新获取一次EurekaServer注册中心中的服务列表信息,如果30秒后获取到的服务列表信息和之前的不一致,服务消费方自动处理(重新获取服务注册表(备份)并缓存到本地)。

#配置eureka服务地址
eureka:
  client:
    service-url:
      defaultZone: http://localhost:7001/eureka
    #每隔30s获取服务中心列表一次(只读备份)
    registry-fetch-interval-seconds: 30

⑨ 失效剔除和自我保护
当 Eureka Client 和 Eureka Server 不再有心跳时,Eureka Server 会将该服务实例从服务注册列表中删除,即服务剔除。
(1)服务下线
当服务正常关闭操作时,会发送服务下线的REST请求给EurekaServer。
服务中心接受到请求后,将该服务置为下线状态
(2)失效剔除
服务中心每隔一段时间(默认60秒)将清单中没有续约的服务剔除。
通过eviction-interval-timer-in-ms配置可以对其进行修改,单位是毫秒

eureka:
  client:
    register-with-eureka: false #是否将自己注册到Eureka中,false表示关闭掉
    fetch-registry: false #是否从eureka中获取服务,false表示关闭掉
    service-url:
      defaultZone: http://127.0.0.1:7001/eureka  # EurekaServer服务端的地址
  #server:
    #失效服务剔除,默认60s(毫秒为单位)
    eviction-interval-timer-in-ms: 6000

(3)自我保护机制
默认情况下,如果 Eureka Server 在90s内没有接收到某个微服务实例的心跳,会注销该实例。但是在微服务架构下服务之间通常都是跨进程调用,网络通信往往会面临着各种问题,比如微服务状态正常,网络分区故障,导致此实例被注销。
Eureka 自我保护机制是为了防止误杀服务而提供的一个机制。
固定时间内大量实例被注销,可能会严重威胁整个微服务架构的可用性。为了解决这个问题,Eureka 开发了自我保护机制,那么什么是自我保护机制呢?
EurekaServer在运行期间会去统计心跳失败比例,在15分钟之内是否低于85%,如果低于 85%,EurekaServer即会进入自我保护机制。
服务中心页面会显示如下提示信息:
在这里插入图片描述
Eureka Server 进入自我保护机制,会出现以下几种情况:
(1)Eureka 不再从注册列表中移除因为长时间没收到心跳而应该过期的服务
(2)Eureka 仍然能够接受新服务的注册和查询请求,但是不会被同步到其它节点上(即保证当前节点依然可用)
(3)当网络稳定时,当前实例新的注册信息会被同步到其它节点中

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值