二,服务的注册和发现Eureka

写在前面的话:本文大部分都是抄写的,课堂的资料写的又特别好。目前的我还不知道怎么改写写出我的笔记。以后再改吧。
感谢你的路过,希望学生的笔记能给你一点微不足道的参考(2/100)
Java基础思维导图,完整Java体系的链接
微服务部分内容链接
大概十几个文章吧

2.1 Eureka简介

   Eureka相当于微服务架构中的“滴滴”。负责微服务的注册和发现工作,它记录了服务和服务地址的映射关系。在分布式架构中,服务会注册到Eureka注册中心,当服务需要调用其它服务时,就从Eureka找到服务的地址,进行调用。Eureka在Spring Cloud中的作用是用来作为服务治理实现服务注册和发现。Eureka主要涉及到三大角色:服务提供者、服务消费者、注册中心。
      服务注册是指,各个微服务在启动时,将自己的网络地址等信息注册到Eureka,服务提供者将自己的服务信息,如服务名、IP等告知服务注册中心。
      服务发现是指当一个服务消费者需要调用另外一个服务时,服务消费者从Eureka查询服务提供者的地址,并通过该地址调用服务提供者的接口。一个服务既可以是服务消费者,也可以是服务发现者。
   各个微服务与注册中心使用一定机制(例如心跳)通信。如果Eureka与某微服务长时间无法通信,Eureka会将该服务实例从服务注册中心中剔除,如果剔除掉这个服务实例过了一段时间,此服务恢复心跳,那么服务注册中心将该实例重新纳入到服务列表中,Eureka架构图,如图2-1所示。
在这里插入图片描述
图2-1 Eureka原理图
   注意:Eureka2.x已经停更,解决方案推荐使用Nacos作为替换方案,Nacos在Spring Cloud Alibaba中讲解。

2.2 Eureka入门

2.2.1Eureka的一些概念

联系图一起看更好。
1,Register — 服务注册
   当Eureka Client向Eureka Server注册时,Eureka Client提供自身的元数据,比如IP地址、端口、运行状况指标的URL,主页地址等信息。
2,Renew — 服务续约
   Eureka Client在默认情况下会每隔30秒发送一次心跳来进行服务续约,通过服务续约来告知Eureka Server该Eureka Client依然可用,正常情况下,如果Eureka Server在90秒内没有收到Eureka Client的心跳,Eureka Server会将Eureka Client实例从注册列表中删除,注意:官网建议不要更爱服务续约的间隔时间。
3,Fetch Registries — 获取服务注册列表信息
   Eureka Client从Eureka Server获取服务注册表信息,并将其缓存到本地。Eureka Client 会使用服务注册列表信息查找其他服务的信息,从而进行远程调用,改注册列表信息定时(每隔30秒)更新一次,每次返回的注册列表信息可能与Eureka Client的缓存信息不同,Erueka Client会重新获取整个注册表信息。Eureka Server缓存了所有的服务注册表信息,并且进行了压缩。Eureka Client和Eureka Server可以使用json和xml的数据格式进行通信,默认,Eureka Client使用JSON格式方式来获取服务器注册列表信息。
4,Cancel — 服务下线
   Eureka Client在程序关闭时可以向Eureka Server发送下线请求,发送请求后,该客户端的实例信息将从Eureka Server的服务注册列表信息中删除。改下线请求不会自动完成,需要在程序关闭时调用以下代码DiscoveryManager.getInstance().shutdownComponent();
5,Eviction — 服务
   在默认情况下,Eureka Client连续90秒没有想Eureka Server发送服务续约(心跳)时,Eureka Server会将该服务实例从服务列表中删除。即服务剔除。

2.2.2 Eureka入门

本节介绍Eureka的基本使用,创建Eureka Server,让后将上面支付微服务,和订单微服务注册到Eureka Server中。Eureka基本机构主要包括以下3个角色。
   ● Eureka Server:服务注册中心,提供服务注册和发现功能。
   ● Provider Service:服务提供者,案例中就是支付微服务。
   ● Consumer Service:服务消费者,案例中就是订单微服务。

2.2.3 EurekaServer

1.选择依赖
选择下面依赖,如图2-2所示。
   ● Spring Boot 2.4.8
   ● Spring Boot DevTools
   ● Lombok
   ● Eureka Server
在这里插入图片描述
pom.xml配置文件代码如下。

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.8</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.lxs.demo</groupId>
    <artifactId>04_cloud_eureka</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>04_cloud_eureka</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>2020.0.3</spring-cloud.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</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>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

2.启动器

@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaApplication.class, args);
    }
}

   注:@EnableEurekaServer,声明当前应用为Eureka Server
3.配置文件

server:
  port: 9004
spring:
  application:
    name: eureka-server
eureka:
  client:
    service-url:
      # eureka 服务地址,如果是集群的话;需要指定其它集群eureka地址
      defaultZone: http://127.0.0.1:9004/eureka
    # 不注册自己
    register-with-eureka: false
    # 不拉取服务
    fetch-registry: false

4.启动并测试
   启动应用访问http://localhost:9004/,效果如图2-3所示。
在这里插入图片描述

2.2.4 服务提供者

改造支付服务作为服务提供者,提供支付服务,注册到Eureka Server。
1.添加依赖
   在支付微服务工程pom.xml中添加如下依赖。

<properties>
    <java.version>1.8</java.version>
    <spring-cloud.version>2020.0.3</spring-cloud.version>
</properties>
<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
</dependencies>

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

2.配置文件
   application.yml配置如下。

server:
  port: 9001
spring:
  application:
    name: cloud-payment-service
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:9004/eureka
    fetch-registry: true
    register-with-eureka: true

注意:
   ● 这里我们添加了spring.application.name属性来指定应用名称,将来会作为服务的id使用。
   ● 不用指定register-with-eureka和fetch-registry,因为默认是true
3.启动器

@SpringBootApplication
@EnableDiscoveryClient
public class PaymentApplication {
    public static void main(String[] args) {
        SpringApplication.run(PaymentApplication.class, args);
    }
}

4.启动并测试
   启动应用,效果如图2-4所示
在这里插入图片描述

2.2.5 服务消费者

   改造订单微服务,订单服务调用支付服务,订单微服务作为服务消费者,当然订单服务既可以作为消费者,调用支付服务,也可以作为被其他服务调用,作为服务提供者,所以订单服务也可以注册到Eureka Server
1.添加依赖
   在支付微服务工程pom.xml中添加如下依赖。

<properties>
    <java.version>1.8</java.version>
    <spring-cloud.version>2020.0.3</spring-cloud.version>
</properties>
<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
</dependencies>

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

2.配置文件
   application.yml配置如下。

server:
  port: 9002
spring:
  application:
    name: cloud-order-service
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:9004/eureka

注意:
   ● 这里我们添加了spring.application.name属性来指定应用名称,将来会作为服务的id使用。
   ● 不用指定register-with-eureka和fetch-registry,因为默认是true.
3.启动器

@SpringBootApplication
@EnableDiscoveryClient
public class OrderApplication {

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

    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

}

4 OrderController
   修改OrderController,代码如下。

@RestController
@RequestMapping("/order")
public class OrderController {

    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private DiscoveryClient discoveryClient;

    @GetMapping("/payment/{id}")
    public ResponseEntity<Payment> getPaymentById(@PathVariable("id") Integer id) {
        String url = "http://localhost:9001/payment/" + id;

        List<ServiceInstance> serviceInstances = discoveryClient.getInstances("cloud-payment-service");
        ServiceInstance serviceInstance = serviceInstances.get(0);
        url = "http://" + serviceInstance.getHost() + ":" + serviceInstance.getPort() + "/payment/" + id;


        Payment payment = restTemplate.getForObject(url, Payment.class);
        return ResponseEntity.ok(payment);
    }

}

5.启动并测试
   启动应用,测试效果如图2-5所示。
在这里插入图片描述

2.3 Eureka的自我保护

   当有一个新的Eureka Server出现时,他尝试从相邻的Peer节点获取所有服务实例注册信息。如果从相邻的Peer节点获取信息时出现了故障,Eureka Server会尝试其他的Peer节点。如果Eureka Server能够成功获取所有的服务实例信息。则根据配置信息设置服务续约的阈值。在任何时间,如果Eureka Server接收到的服务续约低于为该值配置的百分比(默认为15分钟内低于85%),则服务器开启自我保护模式,即不再剔除注册列表的信息。
   这样做的好处在于,如果Eureka Server自身的网络问题而导致Eureka Client无法续约,Eureka Client的注册列表信息不再被删除,也就是Eureka Client还可以被其他服务消费。自我保护开启后,效果如图2-6所示。
在这里插入图片描述
   在默认情况下,Eureka Server的自我保护模式是开启的,生产环境下这很有效,保证了大多数服务依然可用,但是这给我们的开发带来了麻烦, 因此开发阶段我们都会关闭自我保护模式。代码如下

eureka:
  server:
    enable-self-preservation: false # 关闭自我保护模式(缺省为打开)
    eviction-interval-timer-in-ms: 1000 # 扫描失效服务的间隔时间(缺省为60*1000ms)

2.4 Eureka Server集群

   Eureka Server不但需要接收服务的心跳,用来检测服务是否可用,而且每个服务会定期会去Eureka申请服务列表的信息,当服务实例很多时,Eureka中的负载就会很大,所以必须实现Eureka服务注册中心的高可用,一般的做法是将Eureka Server集群化。
1.配置文件
   更改Eureka Server的配置文件 application.yml,在改配置文件中,采用多profile格式,代码如下。

---
spring:
  config:
    activate:
      on-profile: peer1
server:
  port: 9003
eureka:
  instance:
    hostname: peer1
  client:
    service-url:
      defaultZone: http://peer2:9004/eureka,http://peer3:9005/eureka
---
spring:
  config:
    activate:
      on-profile: peer2
server:
  port: 9004
eureka:
  instance:
    hostname: peer2
  client:
    service-url:
      defaultZone: http://peer1:9003/eureka,http://peer3:9005/eureka
---
spring:
  config:
    activate:
      on-profile: peer3
server:
  port: 9005
eureka:
  instance:
    hostname: peer3
  client:
    service-url:
      defaultZone: http://peer1:9003/eureka,http://peer2:9004/eureka      

注:
   ● 在yaml单一配置文件中,可用连续三个连字号(—)区分多个文件。
   ● Spring Boot2.4.x使用spring.config.activate.on-profile代替原来的spring.profiles
2.域名解析
   因为本地搭建Eureka Server集群,所以需要修改本地的host文件,   c:\Windows\System32\drivers\etc\hosts,代码如下。

127.0.0.1 peer1
127.0.0.1 peer2
127.0.0.1 peer3

3.启动并测试
   通过mvn package编译后,使用java -jar方式启动,并通过–spring.profiles.active指定配置文件,本案例中需要启动2个Eureka Server实例,他们的配置文件分别是peer1和peer2,命令如下

java -jar 04_cloud_eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer1
java -jar 04_cloud_eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer2
java -jar 04_cloud_eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer3

   启动支付服务,支付微服务仅向9004的Eureka Server注册,代码如下。

eureka:
  client:
    service-url:
      defaultZone: http://peer1:9003/eureka,http://peer2:9004/eureka,http://peer3:9005/eureka

   此时,支付服务并没有向9003注册,访问Eureka Server的节点的peer1管控台界面,可见9004的注册列表信息已经,同步到了9003节点,效果如图2-7所示
在这里插入图片描述
补充:我再学习的时候遇见的问题。
我在进行maven打包的时候遇见了问题:
首先,进行maveninstall显示:
在这里插入图片描述
我看一下问题:
1,首先UTF-8有问题:我尝试了在pom里的三处改动utf-8,没有解决问题。问题不大。先过
2,主要是这个问题:
Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0
这个应该是什么maven-resources-plugin的版本问题,找个博客,pom里换包,成功。
在这里插入图片描述
然后执行命令时遇到了这种问题:
在这里插入图片描述
原来是文件名称没有对应,改完-OK。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值