• Spring Cloud(一)Eureka服务注册与发现


    1 概述

    Eureka就像一个物业管理公司,其他微服务就像小区的住户,每个住户入住时都要向物业管理公司注册,并定时向物业公司交管理费

    1.1 介绍

    1. Eureka是一个基于REST的服务,用于定位服务,以实现云端中间层服务发现和故障转移。
    2. Eureka主管服务注册与发现,在微服务中,以后了这两者,只需要使用服务的标识符(就是那个在每个服务的yml文件中取得服务名称),就可以访问到服务,不需要修改服务调用的配置文件。
    3. Eureka遵循AP原则(高可用,分区容错性),因为使用了自我保护机制所以保证了高可用。

    1.2 原理

    1. Eureka使用的是C-S结构(客户端-服务端)
    2. 两大组件:Eureka Server(提供注册服务)、 Eureka Client(JAVA客户端,负责发送心跳)
    3. 系统中的其他微服务使用Eureka客户端连接到Eureka服务端维持心跳连接(即注册)。SpringCloud的其他模块可以通过Eureka Server 来发现系统中的微服务并加以调用

    1.3 架构图

    架构图

    2 Eureka服务注册中心构建

    2.1 加入服务端依赖

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-eureka-server</artifactId>
    </dependency>
    

    2.2 配置文件

    理解:物业公司肯定不向自己注册自己,并肯定知道自己在哪,不用参加检索

    spring.application.name=spring-cloud-eureka
    server.port=7001
    eureka.instance.hostname=localhost
    #false表示不向注册中心注册自己。
    eureka.client.register-with-eureka=false 
    #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
    eureka.client.fetch-registry=false
    #设置与Eureka Server交互的地址,查询服务和注册服务都需要依赖这个地址。默认是http://localhost:8761/eureka ;多个地址可使用“,”分隔。
    eureka.client.serviceUrl.defaultZone=http://localhost:7001/eureka/
    

    2.3 添加启动类

    注意:要在类前加@EnableEurekaServer标注

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

    3 向Eureka注册中心注册微服务

    3.1 在要注册的微服务的pom.xml文件中增加依赖

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

    3.2 修改配置文件

    1. 在application.properties中增加以内容,将客户端注册到服务列表内。
    2. 理解:小区用户要找到物业管理处的地址进行注册。
    eureka.client.serviceUrl.defaultZone=http://localhost:7001/eureka
    
    1. 主启动类增加注解:@EnableEurekaClient
    @SpringBootApplication
    @EnableEurekaClient
    public class SpringCloudProviderApplication8001 {
    	public static void main(String[] args) {
    		SpringApplication.run(SpringCloudProviderApplication8001.class, args);
    	}
    }
    

    4 actuator与微服务注册完善

    4.1 修改服务名称,在yml中eureka节点下添加如下内容

    #更改服务客户端显示名
    eureka.instance.instance-id=spring-cloud-provider-8001
    #显示info ip
    eureka.instance.prefer-ip-address=true
    

    更改服务客户端显示名

    4.2 info内容的详细信息修改

    在这里插入图片描述
    作用:在查看Eureka时点击进入某个微服务的info时,能给查看者一些必要的信息,可以帮助查看者快速的了解该微服务,开发中十分有意义。

    4.2.1 修改方法

    1. 当前工程添加依赖。
    <dependency>
    	<groupId>org.springframework.boot</groupId>
    	<artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    
    1. 总的父工程的build节点下添加如下内容。
    <build>
    	<finalName>microservice</finalName>
    	<resources>
    		<resource>
    			<!--允许访问该工程src/main/resources路径下所有内容-->
    			<directory>src/main/resources</directory>
    			<filtering>true</filtering>
    		</resource>
    	</resources>
    	<plugins>
    		<plugin>
    			<!--负责解析的插件-->
    			<groupId>org.apache.maven.plugins</groupId>
    			<artifactId>maven-resources-plugin</artifactId>
    			<configuration>
    				<delimiters>
    					<!--内容只要以$开头和以$结尾的信息都可以进行动态读取-->
    					<delimit>$</delimit>
    				</delimiters>
    			</configuration>
    		</plugin>
    	</plugins>
    </build>
    
    1. 在当前工程的application.properties文件添加以下信息。
    info.author=ChenYu lin
    info.name=spring-cloud-study
    info.company.name=www.xxxx.com
    
    1. 访问http://[ip]:[端口]/info
      在这里插入图片描述

    5 Eureka的自我保护

    5.1 介绍

    Eureka的自我保护机制主要是为了网络异常时保持高可用设计的,当在Eureka中注册的微服务超过设定是时间内(默认90秒)没有向Eureka服务端发送心跳,该微服务会进入自我保护模式。在自我保护模式中,Eureka会保护服务注册表中的信息,不会注销任何服务实例,直至收到的心跳数恢复至阈值以上,该微服务退出自我保护模式。

    5.2 理解

    好死不如赖活:Eureka的设计哲学是宁可保留错误的服务信息,也不盲目注销可能健康的服务。所以异常的服务不会被注销,而是进入了自我保护模式。

    5.3 自我保护模式的开关

    在Eureka Server模块下的yml文件中添加配置信息即可,true表示打开自我保护模式;false表示关闭自我保护模式(不推荐 )

    server.enable-self-preservation=false
    

    6 Eureka的服务发现

    6.1 介绍

    系统中的微服务可以通过Eureka的服务发现去获得在Eureka中注册的服务的信息,这是一个对外暴露的接口。

    6.2 使用方法(provider中)

    1. 注入DiscoveryClient 对象(spring包下的),在controller方法中获取。
    @Autowired
    private DiscoveryClient discoveryClient;
    
    @ResponseBody
    @GetMapping("/provider/discovery")
    public Object discovery(){
        List<String> list = discoveryClient.getServices();
        System.out.println(list);
        List<ServiceInstance> insList = discoveryClient.getInstances("spring-cloud-prodiver");
        for (ServiceInstance si:insList) {
            System.out.println(si.getHost() +"," + si.getServiceId() +"," +si.getPort() +"," +si.getUri() +"," +si.getMetadata());
        }
        return this.discoveryClient;
    }
    
    1. 在主启动类中加入@EnableDiscoveryClient注解。
    2. 启动工程,访问
      在这里插入图片描述

    6.3 使用方法(consumer中)

    1. 在controller方法中使用restTemplate对象调用provider中暴露的URL 并获得返回对象即可。
    @GetMapping(value = "/discovery")
    public Object discovery() {
    	return restTemplate.getForObject(REST_URL_PREFIX + "/provider/discovery", Object.class);
    }
    
    1. 启动该消费工程,访问该接口。
      在这里插入图片描述
      看源码点这里
    只有把命运掌握在自己手中,从今天起开始努力,即使暂时看不到希望,也要相信自己。因为比你牛几倍的人,依然在努力。
  • 相关阅读:
    JOISC2017 手持ち花火 (Sparklers) 题解
    Codeforces 1427E. Xum 题解
    AGC027D
    Codeforces 1416F. Showing Off 题解
    AGC032F
    AGC019E
    TCP实验(前言)
    OS第一次实验截图
    第12组 Beta (2/6)(丁泽中)
    第12组 Beta (1/6)(丁泽中)
  • 原文地址:https://www.cnblogs.com/freesky168/p/14358230.html
Copyright © 2020-2023  润新知