微服务---服务注册中心Eureka

一.简介

Spring Cloud Eureka 是由Netfilx公司开发的基于Rest服务的服务治理套件。
在这里插入图片描述
Eureka Server(服务注册中心):提供服务注册和发现功能.
ServiceProvider(EurekaClient):提供服务,并将服务注册到服务注册中心.
ServiceConsumer(EurekaClient):拉取服务列表并消费服务.

二.搭建单机版Eureka架构

在这里插入图片描述

我们采用一个EurekaServer(服务注册中心),两个EurekaClient(一个服务生产者和一个服务消费者)

1.搭建EurekaServer(7001端口)
  1. 导入依赖
       <dependency>
           <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
       </dependency>
  1. 编写application.yml文件
server:
  port: 7001  #服务启动的端口

eureka:
  instance:
    hostname: localhost #eureka服务端的实例名
  client:
    #false代表不向服务注册中心注册自己
    register-with-eureka: false
    #false代表只需维护服务注册中心注册的服务实例而不用去检索服务
    fetch-registry: false
    service-url:
      defaultZone: http://localhost:7001/eureka/
  1. 启动类上加上@EnableEurekaServer注解.
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerMain7001 {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServerMain7001.class, args);
    }
}

访问localhost:7001,可以看到下面画面,代表启动成功.
在这里插入图片描述

2.搭建EurekaClient—生产者(8001端口)
  1. 导入依赖
      <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
      </dependency>
  1. 修改application.yml文件
server:
port: 8081

spring:
application:
  name: cloud-payment-service
eureka:
instance:
  hostname: localhost
client:
  #向服务注册中心注册
  register-with-eureka: true
  #向服务注册中心拉取注册的服务实例(单机版provider无所谓,集群必须设置为true才能配合ribbon使用负载均衡)
  fetch-registry: true
  #服务注册中心Server向外提供的服务接口URL
  service-url:
    #这里是服务注册中心(EurekaServer)的URL
    defaultZone: http://localhost:7001/eureka/
  1. 在主启动类上加上@EnableEurekaClient注解
@SpringBootApplication
@EnableEurekaClient
public class PaymentMain8081 {
  public static void main(String[] args) {
      SpringApplication.run(PaymentMain8081.class, args);
  }
}
  1. 具体的业务代码…

启动后再访问localhost:7071就可以看见多了一个Eureka实例
在这里插入图片描述

3.搭建EurekaClient—消费者(80端口)

除具体业务代码不同,其他与EurekaClient—生产者相同.

启动后实例变为两个
在这里插入图片描述

4.EurekaClient—消费者使用RestTemplate消费EurekaClient—生产者提供的服务
  1. 创建RestTemplate
/**
* 相当于applicationContext.xml
*/
@Configuration
public class ApplicationContextConfig {
   @Bean
   public RestTemplate getRestTemplate() {
       return new RestTemplate();
   }
}
  1. 在Controller中进入注入,并调用RestTemplate具体的逻辑方法
@Autowired
private RestTemplate restTemplate;

通过RestTemplate我们就可以进行GET,POST等方法的调用了.

注意:使用RestTemplate进行调用时,要传入提供服务的URL
1.使用具体的地址
URL=http://127.0.0.1:8081
2.使用服务名(⭐️推荐使用)
URL=http://CLOUD-PAYMENT-SERVICE

举例:

@GetMapping("/get/{id}")
    public CommonResult getPayment(@PathVariable("id") Long id) {
        return restTemplate.getForObject("http://CLOUD-PAYMENT-SERVICE" + "/payment/get/" + id, CommonResult.class);
    }

二.搭建集群版(高可用)Eureka架构

在这里插入图片描述
在这里插入图片描述
我们采用两个EurekaServer(服务注册中心)相互注册,三个EurekaClient(一个消费者,两个生产者构成集群)

搭建集群版是基于单机版的,很多重复步骤,我就主要讲不同点

0.我们只有一台电脑,集群需要至少两台电脑,为了进行模拟,修改host文件
  1. 进入C:\Windows\System32\drivers\etc\
  2. 默认修改不了host文件,需要修改权限:属性–>安全–>高级–>添加–>选择主体–>输入电脑用户名–>检查名称–>.基本权限全部√
  3. 属性–>只读的√去掉
  4. 修改host文件,增加server1,server2.
    在这里插入图片描述
1.搭建EurekaServer集群(7001端口,7002端口)
  1. 修改application.yml,将service-url设置为另外一个EurekaServer,其它相同.
server:
 port: 7001

eureka:
 instance:
   hostname: server1 #eureka服务端的实例名
 client:
   #false代表不向服务注册中心注册自己
   register-with-eureka: false
   #false代表只需维护服务注册中心注册的服务实例而不用去检索服务
   fetch-registry: false
   service-url:
     #设置与Eureka交互的地址(查询和注册服务)
     #集群模式指向其它Eureka Server
     defaultZone: http://server2:7002/eureka/
     #单机模式指向自己
     #defaultZone: http://server1:7001/eureka/

好了之后访问server1:7001,可以看见,同时也可以访问server2:7002
在这里插入图片描述

2.搭建EurekaClient(生产者)集群(8081端口,8082端口)
  1. 之前我们的service-url,只有写了一个服务注册中心的url,现在我们有了两个服务注册中心,需要写上两个服务注册中心的url,用,进行分割。
server:
 port: 8081

spring:
 application:
   name: cloud-payment-service

eureka:
 instance:
   hostname: localhost
   
 client:
   #向服务注册中心注册
   register-with-eureka: true
   #向服务注册中心拉取注册的服务实例(单机版provider无所谓,集群必须设置为true才能配合ribbon使用负载均衡)
   fetch-registry: true
   #服务注册中心Server向外提供的服务接口URL
   service-url:
     defaultZone: http://server1:7001/eureka/,http://server2:7002/eureka/
3.有了两个生产者,消费者究竟选择哪个生产者进行消费?

还记得之前说过我们通过RestTemplate进行远程方法调用来消费服务吗?,如果有多个生产者,我们只需要在RestTemplate的bean上加上@loadBalance注解行了!

/**
 * 相当于applicationContext.xml
 */
@Configuration
public class ApplicationContextConfig {

    @Bean
    //@LoadBalanced注解提供了RestTemplate负载均衡的能力
    @LoadBalanced
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
}

效果例子:第一次访问是8080端口,刷新后是8081端口,不断轮询
在这里插入图片描述
在这里插入图片描述

三.常用的配置

  1. 自己设置显示的实例名,以及鼠标放实例名上显示为ip.
eureka:
 instance:
   hostname: localhost
   instance-id: order80
   prefer-ip-address: true   #显示出ip

在这里插入图片描述

  1. 关闭 Eureka自我保护机制.

在我们打开eureka的web管理界面是经常看到红色提示.

EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY’RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.
在这里插入图片描述
这是因为Eureka Client通过心跳机制每隔30s告知Eureka Server一次我还存活,如果90s内没告知,就认为Eureka Server不可用了,但是某时刻某个微服务不可用了,Eureka不会立即清理,依旧会对该微服务的信息进行保存.这样就保证了Eureka Client是好的,由于网络故障导致不可用,Eureka Client仍然存在服务注册中心,等待Client的恢复.
Eureka的自我保护默认是开启的,不过我们可以通过设置enable-self-preservation=false将自我保护机制关闭

eureka:
   server:
     #关闭自我保护机制,保证不可用服务被及时剔除
     enable-self-preservation: false
     eviction-interval-timer-in-ms: 90000

客户端中也可以修改心跳机制的默认时间

eureka:
  instance:
    hostname: localhost
    instance-id: order80
    prefer-ip-address: true   #显示出ip
    #客户端向服务注册中心发送心跳间隔(默认30秒)
    lease-renewal-interval-in-seconds: 30
    #最后一次心跳后,剔除服务等待时间(默认90秒)
    lease-expiration-duration-in-seconds: 90

具体相关代码:https://github.com/wantao666/SpringCloud2020

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Selenium399

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值