参考地址:https://www.cnblogs.com/l-y-h/p/14193443.html#_label2_5

gitee流:https://gitee.com/wminlin/service-registry.git

一、Eureka 基础说明:

【基本说明:】
    Eureka 使用 分为 server 与 client。
    首先需要创建一个 Eureka Server 模块(eureka_server_7000),作为 服务注册中心。
    前面创建的两个模块 consumer_9000、producer_8000 可以作为 Eureka Client 模块。
注:
    producer_8000 作为 服务提供者,向 Eureka Server 中注册。
    consumer_9000 作为 服务消费者,从 Eureka Server 中发现服务。
    创建与 consumer_9000 一样的 eureka_client_consumer_9001 作为服务消费者进行演示。
    创建与 producer_8000 一样的 eureka_client_producer_8001 作为服务提供者进行演示。 
    
    单机版没使用价值,主要是为了由浅入深,为后面的集群版做铺垫。
也即:
    单机版需要创建三个子工程。
        eureka_server_7000                作为服务注册中心
        eureka_client_producer_8001       作为服务提供者(提供服务)
        eureka_client_consumer_9001       作为服务消费者(调用服务)
    
    eureka_client_producer_8001 与 eureka_client_consumer_9001 都会注册进 eureka_server_7000。
    eureka_client_consumer_9001 通过 eureka_client_producer_8001 配置的服务名,在 eureka_server_7000 注册中心中找到 eureka_client_producer_8001 真实地址。
    然后再通过 RestTemplate 远程调用该地址,从而完成 服务之间的交互。

  

涉及 Eureka 项目,及项目之间的关系:

 

 二、项目搭建:

  1、创建一个 Eureka Server 子模块 (eureka_server_7000),作为服务注册中心;

  • 创建 eureka_server_7000 的springboot 子模块项目;
  • 引入 Eureka Servers 依赖;
  • 在父工程中管理 springcloud 版本;
  • 在 子模块 中引入 eureka-server 依赖;
【父工程管理 springcloud 版本:】
<properties>
  <springcloud.version>Hoxton.SR9</springcloud.version>
</properties>

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-dependencies</artifactId>
      <version>${springcloud.version}</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

【子工程引入 eureka-server 依赖】
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

  

   2、配置子项目 Eureka Server 的配置文件:

【application.propertion】

server.port=7000

# 配置当前的实例的主机名
eureka.instance.hostname=localhost
# 设置当前实例的IP地址
eureka.instance..ip-address=127.0.0.1
# 设置服务端实例名称,优先级高于 spring.application.name
eureka.instance.appname=Eureka-Server
# 设置实例 ID
eureka.instance.instance-id=eureka-server-instance01

# Eureka Server 自身作为注册中心时,没必要 把自己也注册进 注册中心 (无意义),所以一般下列两项都设置为false
# 默认为 true,设置 false 表示不向注册中心注册自己
eureka.client.registerWithEureka=false
# 默认为 true,设置 false 表示不去注册中心 获取 注册信息
eureka.client.fetchRegistry=false
# 关闭自我保护机制,保证不可用服务及时剔除
eureka.server.enableSelfPreservation=false

# 默认为 false,设置为 true 时,则显示在注册中心的是 IP地址, 而非 主机名
eureka.server.prefer-ip-address=false
#设置 Eureka 服务器地址,类型为 HashMap,默认为: serviceUrl.put("defaultZone", "http://http://localhost:8761/eureka/");
eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka

  

 

   3、配置并启动 子项目 Eureka Server 服务:

  在启动项目之前,需要在子项目的启动类中,加入 @EnableEurekaServer 注解,用于开启 Eureka Server;

 

 

   启动完毕后,打开地址 localhost:7000(或 127.0.0.1:7000),出现一下画面,说明 注册中心配置 成功:

 

 

   4、创建子工程 eureka_client_producer_8001:

  创建一个与 producer_8000 相同的子工程 eureka_client_producer_8001。

  作为 Eureka Client ,并注册到 注册中心中;

  步骤一、 创建 子工程 eureka_client_producer_8001,并引入 eureka_client 依赖;与 producer_8000 的创建流程相同,直接 copy 然后修改即可,在此基础上引入以下依赖:

【 eureka_client_producer_8001 引入 eureka_client 依赖】
<dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

  

 

   步骤二、配置 Eureka Client:

  打开 eureka_client_producer_8001 的配置文件,并填入:

server.port=8001

spring.application.name=eureka-producer-8001
#修改点
#spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver
#spring.datasource.data-username=root
spring.datasource.username=root
#spring.datasource.data-password=123456
spring.datasource.password=123456
#修改点
spring.datasource.url=jdbc:mysql://localhost:3306/testMyBatisPlus?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT

spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true

# 配置服务端实例名称,优先级高于 spring.application.name
#eureka.instance.appname=eureka-producer-8001
# 设置当前实例 id
#eureka.instance.instance-id=${eureka.instance.appname}
# 默认为 true,注册到注册中心
eureka.client.register-with-eureka=true
# 默认为 true,从注册中心 获取 注册信息
eureka.client.fetch-registry=true
# 指向 注册中心 地址,即 eureka_server_7000 的堵住
eureka.client.service-url.defaultZone=http://localhost:7000/eureka

  

 

   步骤三、启动 Eureka Client 服务

  在 eureka_client_producer_8001 的启动类上,添加 @EnableEurekaClient 注解,用于开启EurekaClient(不添加也可以正常注册到注册中心);

  

 

 

 

 

  5、创建子工程 eureka_client_consumer_9001 :

  创建一个与 consumer_9000 相同的子工程,eureka_client_consumer_9001。

  作为 Eureka Client ,b并注册到 注册中心;

  步骤一、创建 eureka_client_consumer_9001:

    与创建 eureka_client_producer_8001 类似;

    直接 copy 一份 consumer_9000 代码进行修改;

    引入 Eureka_Client 依赖;

    配置 Eureka_Client,然后在启动类上添加 @EnableEurekaClient 注解;

【eureka_client_consumer_9001 引入 eureka_client 依赖:】
<dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

【eureka_client_consumer_9001 的配置文件内容:】
server.port=9001

spring.application.name=eureka-consumer-9001
spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=123456
#spring.datasource.data-username=root
#spring.datasource.data-password=123456
spring.datasource.url=jdbc:mysql://localhost:3306/MicroServices?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT

# 配置服务端实例名称,优先级高于 spring.application.name
#eureka.instance.appname=eureka-consumer-9001
# 设置当前实例 id
#eureka.instance.instance-id=${eureka.instance.appname}
# 默认为 true,注册到注册中心
eureka.client.register-with-eureka=true
# 默认为 true,从注册中心 获取 注册信息
eureka.client.fetch-registry=true
# 指向 注册中心 地址,即 eureka_server_7000 的堵住
eureka.client.service-url.defaultZone=http://localhost:7000/eureka

  步骤二、更换 RestTemplate 访问的 URL:

    配置了 Eureka 后,consumer 调用 pruducer 不能直接写死了,应该在 Eureka Server 注册中心 通过 服务名 找到 真实对应的 地址后 再去 远程访问;

    此处需要更换 RestTemplate 的访问地址 (地址名就是 Eureka Client 注册时的 服务名);

    在配置 RestTemplate 时需要添加 @LoadBalanced 注解;

 

   步骤三、启动 eureka_client_consumer_9001 测试一下能否远程调用:

【访问流程:】
        访问 http://localhost:9001/consumer/user/getById?id=3
        内部通过 EUREKA-CLIENT-PRODUCET-8001 服务名找到对应地址 localhost:8001,然后远程调用 http://localhost:8001/producer/user/getById?id=3
        即 :
        consumer 根据 服务注册中心 找到 producer 的地址,
        然后通过 远程调用 该地址,达到 访问 producer 服务的木得;

  

 

 

 

 

填坑:配置单机版遇到的错误:

  为填坑之前的场景:

【场景:】
    没有配置 Eureka 时,consumer 通过 RestTemplate 调用 producer 服务;
    此时调用的地址是写死的,比如:http://localhost:8001/。

    配置了 Eureka 后,consumer、producer 已经注册到 Eureka Server 中;
    此时 consumer 应该是从 Eureka Server 中通过 服务名 获取 producer 的真实地址,然后再通过 RestTemplate 去调用;
    此时调用的地址写的是 被调用的 服务名,比如:http://EUREKA_PRODUCER_8001/

  错误一、未添加 @LoadBalanced 注解:

【错误信息】
    java.net.UnknownHostException: EUREKA-PRODUCER-8001
【解决方法】
    使用 @Bean 配置 RestTemplate 时,同时添加上 @LoadBalanced 注解即可;

  

 

   错误二、服务名称使用了下划线 _ 作为连接符

【错误信息】
        java.lang.IllegalStateException: Request URI does not contain a valid hostname: http://EUREKA_PRODUCER_8001/producer/user/getById?id=3
【解决方法】
        将下划线 _ 替换成 - 或者 .,便可正常访问

  

 

posted on 2022-06-09 17:26  冷漠「」  阅读(114)  评论(0)    收藏  举报