首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >02Eureka服务注册与发现

02Eureka服务注册与发现

作者头像
Remember_Ray
发布2020-10-29 11:09:00
2840
发布2020-10-29 11:09:00
举报
文章被收录于专栏:Ray学习笔记Ray学习笔记

Eureka 两大组件

  1. Eureka Server 提供服务注册服务
  2. Eureka Client 通过注册中心进行访问

单机Eureka构建步骤

cloud-eureka-server7001

pom

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>SpringCloud_H_2020</artifactId>
        <groupId>com.ray</groupId>
        <version>1.0</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>4-cloud-eureka-server7001</artifactId>

    <dependencies>
        <!-- eureka-server -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
        <!-- 引用自己定义的api通用包,可以使用Payment支付Entity -->
        <dependency>
            <groupId>com.ray</groupId>
            <artifactId>1-cloud-api-commons</artifactId>
            <version>${project.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--监控-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!-- 一般通用配置 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

</project>

yml

server:
  port: 7001

eureka:
  instance:
    # eureka 服务端的实例名称
    hostname: localhost
  client:
    # false 表示不在注册中心注册自己
    register-with-eureka: false
    # false 表示自己端就是注册中心,我的职责就是维护服务实例,并不需要检索服务
    fetch-registry: false
    service-url:
      # 设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址
      # 单机 defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

main

package com.ray.springcloud;

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

/**
 * @Description:
 * @Author Ray
 * @Date 2020/10/08 16:53
 * @Version 1.0
 */
@SpringBootApplication
@EnableEurekaServer // 服务端
public class EurekaMain7001 {

    public static void main(String[] args) {
        SpringApplication.run(EurekaMain7001.class, args);
    }
}

测试

http://localhost:7001/

cloud-provider-payment8001

改 pom

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

改 yml

server:
  port: 8001

spring:
  application:
    name: cloud-payment-service
  datasource:
    # 当前数据源操作类型
    type: com.alibaba.druid.pool.DruidDataSource
    # mysql 驱动类
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/cloud2020?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8
    username: root
    password: root

mybatis:
  mapper-locations: classpath*:mapper/*.xml
  type-aliases-package: com.ray.springcloud.entity


# Eureka
eureka:
  client:
    #表示将自己注册进EurekaServer,默认为true
    register-with-eureka: true
    #是否从EurekaServer抓取已有的注册消息,默认为true,单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
    fetch-registry: true
    service-url:
      defaultZone: http://localhost:7001/eureka

改 main

package com.ray.springcloud;

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

/**
 * @Description:
 * @Author Ray
 * @Date 2020/10/07 10:31
 * @Version 1.0
 */
@SpringBootApplication
@EnableEurekaClient  // 客户端
public class PaymentMain8001 {

    public static void main(String[] args) {
        SpringApplication.run(PaymentMain8001.class, args);
    }
}

测试

确保两个端口正常启动

http://localhost:7001/

cloud-consumer-order80

改 pom

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

改 yml

server:
  port: 80

spring:
  application:
    name: cloud-order-service

# Eureka
eureka:
  client:
    #表示将自己注册进EurekaServer,默认为true
    register-with-eureka: true
    #是否从EurekaServer抓取已有的注册消息,默认为true,单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
    fetch-registry: true
    service-url:
      defaultZone: http://localhost:7001/eureka

改 main

package com.ray.springcloud;

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

/**
 * @Description:
 * @Author Ray
 * @Date 2020/10/07 11:41
 * @Version 1.0
 */
@SpringBootApplication
@EnableEurekaClient // 客户端
public class OrderMain80 {

    public static void main(String[] args) {
        SpringApplication.run(OrderMain80.class, args);
    }
}

测试

http://localhost:7001/

集群Eureka构建步骤

cloud-eureka-server7001

改 yml

  port: 7001

eureka:
  instance:
    # eureka 服务端的实例名称 - 单机版
#    hostname: localhost
    # eureka 服务端的实例名称 - 集群版
    hostname: eureka7001.com
  client:
    # false 表示不在注册中心注册自己
    register-with-eureka: false
    # false 表示自己端就是注册中心,我的职责就是维护服务实例,并不需要检索服务
    fetch-registry: false
    service-url:
      # 设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址
      # 单机 defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
#      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
      # 相互注册
      defaultZone: http://eureka7002.com:7002/eureka/

cloud-eureka-server7002

改 yml

server:
  port: 7002

eureka:
  instance:
    # eureka 服务端的实例名称 - 集群版
    hostname: eureka7002.com
  client:
    # false 表示不在注册中心注册自己
    register-with-eureka: false
    # false 表示自己端就是注册中心,我的职责就是维护服务实例,并不需要检索服务
    fetch-registry: false
    service-url:
      # 设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址
      # 相互注册
      defaultZone: http://eureka7001.com:7001/eureka/

修改映射配置

访问:C:\Windows\System32\drivers\etc 下的 host 文件,添加如下内容

127.0.0.1 eureka7001.com
127.0.0.1 eureka7002.com

测试

http://eureka7001.com:7001/

http://eureka7002.com:7002/

将支付服务8001微服务发布到上面2台Eureka集群配置中

改 yml

server:
  port: 8001

spring:
  application:
    name: cloud-payment-service
  datasource:
    # 当前数据源操作类型
    type: com.alibaba.druid.pool.DruidDataSource
    # mysql 驱动类
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/cloud2020?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8
    username: root
    password: root

mybatis:
  mapper-locations: classpath*:mapper/*.xml
  type-aliases-package: com.ray.springcloud.entity


# Eureka
eureka:
  client:
    #表示将自己注册进EurekaServer,默认为true
    register-with-eureka: true
    #是否从EurekaServer抓取已有的注册消息,默认为true,单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
    fetch-registry: true
    service-url:
      # 单机版
#      defaultZone: http://localhost:7001/eureka
      # 集群版
      defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/

将支付服务80微服务发布到上面2台Eureka集群配置中

改 yml

server:
  port: 80

spring:
  application:
    name: cloud-order-service

# Eureka
eureka:
  client:
    #表示将自己注册进EurekaServer,默认为true
    register-with-eureka: true
    #是否从EurekaServer抓取已有的注册消息,默认为true,单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
    fetch-registry: true
    service-url:
      # 单机版
#      defaultZone: http://localhost:7001/eureka
      # 集群版
      defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/

测试

http://eureka7002.com:7002/

http://localhost/consumer/payment/get/136

正常

支付服务提供者8001集群环境搭建

cloud-provider-payment8001

controller

package com.ray.springcloud.controller;

import com.ray.springcloud.entity.CommonResult;
import com.ray.springcloud.entity.Payment;
import com.ray.springcloud.service.PaymentService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;


/**
 * @Description:
 * @Author Ray
 * @Date 2020/10/07 10:41
 * @Version 1.0
 */
@Slf4j
@RestController
@RequestMapping(value = "/payment")
public class PaymentController {

    @Resource
    private PaymentService paymentService;

    @Value("${server.port}")
    private String port;

    @PostMapping(value = "/save")
    public CommonResult save(@RequestBody Payment payment) {
        int result = paymentService.save(payment);
        log.info("新增结果: [{}]", result);

        if (result > 0) {
            return new CommonResult(200, "新增数据成功,ID: " + payment.getId(), result);
        }
        return new CommonResult(500, "新增数据失败", null);
    }

    @GetMapping(value = "/get/{id}")
    public CommonResult getPaymentById(@PathVariable("id") Long id) {
        Payment payment = paymentService.getPaymentById(id);
        log.info("查询结果: [{}],端口号: [{}]", payment, port);

        if (payment != null) {
            return new CommonResult(200, "查询数据成功,端口号: " + port, payment);
        }
        return new CommonResult(500, "查询数据失败,ID: " + id, null);
    }
}

cloud-provider-payment8002

参考 cloud-provider-payment8001,其他保持不变,只改变端口号

改 yml

server:
  port: 8002

spring:
  application:
    name: cloud-payment-service
  datasource:
    # 当前数据源操作类型
    type: com.alibaba.druid.pool.DruidDataSource
    # mysql 驱动类
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/cloud2020?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8
    username: root
    password: root

mybatis:
  mapper-locations: classpath*:mapper/*.xml
  type-aliases-package: com.ray.springcloud.entity


# Eureka
eureka:
  client:
    #表示将自己注册进EurekaServer,默认为true
    register-with-eureka: true
    #是否从EurekaServer抓取已有的注册消息,默认为true,单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
    fetch-registry: true
    service-url:
      # 单机版
      #      defaultZone: http://localhost:7001/eureka
      # 集群版
      defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/

测试

http://localhost/consumer/payment/get/136

问题:重复查询,都是只用 8001 端口,没有实现负载均衡的功能。

解决:如下操作

cloud-consumer-order80

解决问题:重复查询,都是只用 8001 端口,没有实现负载均衡的功能。

改 config

package com.ray.springcloud.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;

/**
 * @Description: 相当于封装了 HttpClient
 * @Author Ray
 * @Date 2020/10/07 11:40
 * @Version 1.0
 */
@Configuration
public class RestTemplateConfig {

    @Bean
    @LoadBalanced // 赋予负载均衡能力
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
}

改 controller

package com.ray.springcloud.controller;

import com.ray.springcloud.entity.CommonResult;
import com.ray.springcloud.entity.Payment;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;

import javax.annotation.Resource;

/**
 * @Description:
 * @Author Ray
 * @Date 2020/10/07 11:42
 * @Version 1.0
 */
@Slf4j
@RestController
@RequestMapping(value = "/consumer")
public class OrderController {

    // 使用支付服务集群后,这里不能写死,这样写只适用于 - 单机版
    //public static final String PAYMENT_URL = "http://localhost:8001";

    // 集群版 注意添加http:// + 服务名称
    public static final String PAYMENT_URL = "http://CLOUD-PAYMENT-SERVICE";

    @Resource
    private RestTemplate restTemplate;

    @GetMapping(value = "/payment/save")
    public CommonResult<Payment> save(Payment payment) {
        return restTemplate.postForObject(PAYMENT_URL + "/payment/save", payment, CommonResult.class);
    }

    @GetMapping(value = "/payment/get/{id}")
    public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id) {
        return restTemplate.getForObject(PAYMENT_URL + "/payment/get/" + id, CommonResult.class);
    }
}

服务名称可以通过这里控制面板查看

测试

http://localhost/consumer/payment/get/136

重复查询, 8001、8002 端口会交替出现,实现负载均衡的功能。

actuator微服务信息完善

以 cloud-provider-payment8001 为例

服务名称修改 + 访问信息ip提示

server:
  port: 8001

spring:
  application:
    name: cloud-payment-service
  datasource:
    # 当前数据源操作类型
    type: com.alibaba.druid.pool.DruidDataSource
    # mysql 驱动类
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/cloud2020?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8
    username: root
    password: root

mybatis:
  mapper-locations: classpath*:mapper/*.xml
  type-aliases-package: com.ray.springcloud.entity


# Eureka
eureka:
  client:
    #表示将自己注册进EurekaServer,默认为true
    register-with-eureka: true
    #是否从EurekaServer抓取已有的注册消息,默认为true,单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
    fetch-registry: true
    service-url:
      # 单机版
#      defaultZone: http://localhost:7001/eureka
      # 集群版
      defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/
  instance:
    # 服务名称修改
    instance-id: payment8001
    # 访问信息ip提示
    prefer-ip-address: true

测试

服务发现Discovery

对于注册到eureka里面的微服务,可以通过服务发现来获得该服务的信息

cloud-provider-payment8001

controller

package com.ray.springcloud.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.List;


/**
 * @Description:
 * @Author Ray
 * @Date 2020/10/10 11:38
 * @Version 1.0
 */
@Slf4j
@RestController
public class DiscoveryController {

    @Resource
    private DiscoveryClient discoveryClient;

    @GetMapping(value = "discovery")
    public Object discovery() {
        List<String> servers = discoveryClient.getServices();

        for (String server : servers) {
            log.info("********element:" + server);
        }

        List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
        for (ServiceInstance instance : instances) {
            log.info(instance.getServiceId() + "\t" + instance.getHost() + "\t" + instance.getPort() + "\t" + instance.getUri());
        }

        return this.discoveryClient;
    }
}

改 main

package com.ray.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

/**
 * @Description:
 * @Author Ray
 * @Date 2020/10/07 10:31
 * @Version 1.0
 */
@SpringBootApplication
@EnableEurekaClient  // 客户端
@EnableDiscoveryClient
public class PaymentMain8001 {

    public static void main(String[] args) {
        SpringApplication.run(PaymentMain8001.class, args);
    }
}

测试

localhost:8001/discovery

控制台输出
控制台输出

eureka 自我保护

某时刻某一个微服务不可用了,Eureka不会立即清理,依旧会对该微服务的信息进行保存

如果在 Eureka Server 的首页看到以下这段提示,则说明 Eureka 进入了保护模式:

cloud-provider-payment8001

改 yml

这里暂时改成单机版

server:
  port: 8001

spring:
  application:
    name: cloud-payment-service
  datasource:
    # 当前数据源操作类型
    type: com.alibaba.druid.pool.DruidDataSource
    # mysql 驱动类
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/cloud2020?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8
    username: root
    password: root

mybatis:
  mapper-locations: classpath*:mapper/*.xml
  type-aliases-package: com.ray.springcloud.entity


# Eureka
eureka:
  client:
    #表示将自己注册进EurekaServer,默认为true
    register-with-eureka: true
    #是否从EurekaServer抓取已有的注册消息,默认为true,单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
    fetch-registry: true
    service-url:
      # 单机版
      defaultZone: http://localhost:7001/eureka
      # 集群版
#      defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/
  instance:
    # 服务名称修改
    instance-id: payment8001
    # 访问信息ip提示
    prefer-ip-address: true
    # Eureka 客户端向服务端发送心跳的实际间隔,单位为秒(默认30秒)
    lease-renewal-interval-in-seconds: 1
    # Eureka 服务端收到最后一次心跳后等待时间上限,单位为秒(默认90秒),超出将剔除服务
    lease-expiration-duration-in-seconds: 2

cloud-eureka-server7001

改 yml

server:
  port: 7001

eureka:
  instance:
    # eureka 服务端的实例名称 - 单机版
#    hostname: localhost
    # eureka 服务端的实例名称 - 集群版
    hostname: eureka7001.com
  client:
    # false 表示不在注册中心注册自己
    register-with-eureka: false
    # false 表示自己端就是注册中心,我的职责就是维护服务实例,并不需要检索服务
    fetch-registry: false
    service-url:
      # 设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址
      # 单机 defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
      # 相互注册
#      defaultZone: http://eureka7002.com:7002/eureka/
  server:
    # 自我保护机制,默认true
    enable-self-preservation: false
    # 剔除间隔,单位毫秒
    eviction-interval-timer-in-ms: 2000

测试

http://eureka7001.com:7001/

先启动7001再启动8001

然后直接关闭 8001 端口

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-10-10|,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Eureka 两大组件
  • 单机Eureka构建步骤
    • cloud-eureka-server7001
      • pom
      • yml
      • main
      • 测试
    • cloud-provider-payment8001
      • 改 pom
      • 改 yml
      • 改 main
      • 测试
    • cloud-consumer-order80
      • 改 pom
      • 改 yml
      • 改 main
      • 测试
  • 集群Eureka构建步骤
    • cloud-eureka-server7001
      • 改 yml
    • cloud-eureka-server7002
      • 改 yml
      • 修改映射配置
      • 测试
    • 将支付服务8001微服务发布到上面2台Eureka集群配置中
      • 改 yml
    • 将支付服务80微服务发布到上面2台Eureka集群配置中
      • 改 yml
      • 测试
  • 支付服务提供者8001集群环境搭建
    • cloud-provider-payment8001
      • controller
    • cloud-provider-payment8002
      • 改 yml
      • 测试
    • cloud-consumer-order80
      • 改 config
      • 改 controller
      • 测试
  • actuator微服务信息完善
    • 服务名称修改 + 访问信息ip提示
      • 测试
  • 服务发现Discovery
    • cloud-provider-payment8001
      • controller
      • 改 main
      • 测试
  • eureka 自我保护
    • cloud-provider-payment8001
      • 改 yml
    • cloud-eureka-server7001
      • 改 yml
      • 测试
相关产品与服务
负载均衡
负载均衡(Cloud Load Balancer,CLB)提供安全快捷的流量分发服务,访问流量经由 CLB 可以自动分配到云中的多台后端服务器上,扩展系统的服务能力并消除单点故障。负载均衡支持亿级连接和千万级并发,可轻松应对大流量访问,满足业务需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档