SpringCloud微服务实战---服务的注册和发现(Eureka)

一、Spring Cloud简介
Spring Cloud是基于SpringBoot的,为开发人员提供了快速构建分布式系统的一些工具,包括配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等。

二、创建服务注册中心
在这里,我们需要用的的组件上Spring Cloud Netflix的Eureka ,eureka是一个服务注册和发现模块。

Eureka:

是纯正的 servlet 应用,需构建成war包部署
使用了 Jersey 框架实现自身的 RESTful HTTP接口
peer之间的同步与服务的注册全部通过 HTTP 协议实现
定时任务(发送心跳、定时清理过期服务、节点同步等)通过 JDK 自带的 Timer 实现
内存缓存使用Google的guava包实现
2.1 首先创建一个maven主工程。
2.2 然后创建2个model工程:一个model工程作为服务注册中心,即Eureka Server,另一个作为Eureka Client
创建过程:

右键工程->创建model-> 选择spring initialir 如下图:
图像

点击“Next”,输入对应的名称,如下图:

点击“Next”,选择“Cloud Discovery”,然后选择“Eureka Server”,如下图:

点击“Next”,选择保存路径,最后点击“Finish”
创建完后的工程的pom.xml文件如下(maven创建的包结构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-zureka</artifactId>
<groupId>com.spring.cloud.zureka</groupId>
<version>0.0.1</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>springcloud-zureka-server</artifactId>
<packaging>jar</packaging>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
</properties>

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

<build>
    <finalName>${artifactId}</finalName>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>${java.version}</source>
                <target>${java.version}</target>
                <testSource>${java.version}</testSource>
                <testTarget>${java.version}</testTarget>
            </configuration>
        </plugin>
    </plugins>
</build>

</project>
2.3 启动一个服务注册中心
只需要一个注解@EnableEurekaServer,这个注解需要在springboot工程的启动application类上加:

/**

扫描二维码关注公众号,回复: 2466398 查看本文章

#配置eureka端口,端口一定要独立
server:
port: 8761

eureka:
instance:
#配置主机名
hostname: localhost
client:
#配置服务注册中心是否以自己为客户端进行注册(配置false)
registerWithEureka: false
#是否取得注册信息(配置false)
fetchRegistry: false
serviceUrl:
#配置eureka服务地址
defaultZone:
http://${eureka.instance.hostname}:${server.port}/eureka/
通过eureka.client.registerWithEureka:false和fetchRegistry:false来表明自己是一个eureka server

2.5 日志配置
创建配置文件bootstrap.yml:

#日志
logging:
config: classpath:logback-spring.xml
path: E:/log/@pom.artifactId@
创建配置文件logback-spring.xml:

%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level --- [%thread] %logger{50} : %msg%n ${LOG_PATH}/info.log ${LOG_PATH}/info-%d{yyyyMMdd}-%i.log 10MB 30 %d{yyyy-MM-dd HH:mm:ss.SSS} %-5level --- [%thread] %logger{50} : %msg%n ERROR ${LOG_PATH}/error.log ${LOG_PATH}/error-%d{yyyyMMdd}-%i.log 500MB 2 %d{yyyy-MM-dd HH:mm:ss.SSS} %-5level --- [%thread] %logger{50} : %msg%n **2.6 查看界面信息** eureka server 是有界面的,启动工程,打开浏览器访问:http://localhost:8761 ,界面如下: No instances available 没有服务被发现,接下来创建服务 **三、创建一个服务提供者 (eureka client)** 当client向server注册时,它会提供一些元数据,例如主机和端口,URL,主页等。Eureka server 从每个client实例接收心跳消息。 如果心跳超时,则通常将该实例从注册server中删除。 创建过程同server类似,创建完pom.xml如下: springcloud-zureka com.spring.cloud.zureka 0.0.1 4.0.0 springcloud-zureka-client jar UTF-8 UTF-8 1.8 org.springframework.cloud spring-cloud-starter-eureka org.springframework.boot spring-boot-starter-web ${artifactId} org.springframework.boot spring-boot-maven-plugin org.apache.maven.plugins maven-compiler-plugin ${java.version} ${java.version} ${java.version} ${java.version} 通过注解@EnableEurekaClient 表明自己是一个eureka client. /** * @Author lixinhao * @Description * @Date 2018/4/13 17:25 */ @EnableEurekaClient @SpringBootApplication @RestController public class EurekaClientApplication { public static void main(String[] args) { SpringApplication.run(EurekaClientApplication.class, args); } @Value("${server.port}") String port; @RequestMapping("/hi") public String home(@RequestParam String name) { return "hi "+name+",i am from port:" +port; } } 在配置文件中注明自己的服务注册中心的地址,application.yml配置文件如下: eureka: client: serviceUrl: #配置eureka服务地址,链接注册中心地址 defaultZone: http://localhost:8761/eureka/ server: port: 8762 spring: application: #在注册中心显示的“Application”名称 name: "@pom.artifactId@" 注:spring.application.name中使用了@pom.artifactId@,在YML文件中需要加上单引号或者双引号,否则无法获取值 需要指明spring.application.name,这个很重要,这在以后的服务与服务之间相互调用一般都是根据这个name 。 启动工程,打开http://localhost:8761 ,即eureka server 的网址: 你会发现一个服务已经注册在服务中了,服务名为springcloud-zureka-client,端口为:8762 **四、Eureka的自我保护模式** 如果在Eureka Server的首页看到以下这段提示,则说明Eureka已经进入了保护模式: 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 Server在运行期间,会统计心跳失败的比例在15分钟之内是否 低于85%,如果出现低于的情况(在单机调试的时候很容易满足,实际在 生产环境上通常是由于网 络不稳定导致),Eureka Server会将当前的实例注册信息保护起来,同时提 示这个警告。保护模式主要用于一组客户端和Eureka Server之间存在网络分 区场景下的保护。一旦进入保护模式,Eureka Server将会尝试保护其服务注 册表中的信息,不再删除服务注册表中的数据(也就是不会注销任何微服务) 解决方法: 1.Eureka Server端:配置关闭自我保护,并按需配置Eureka Server清理无效节点的时间间隔。 > eureka.server.enable-self-preservation # 设为false,关闭自我保护 > eureka.server.eviction-interval-timer-in-ms # 清理间隔(单位毫秒,默认是60*1000) 2.Eureka Client端:配置开启健康检查,并按需配置续约更新时间和到期时间 > eureka.client.healthcheck.enabled # 开启健康检查(需要spring-boot-starter-actuator依赖) > eureka.instance.lease-renewal-interval-in-seconds # 续约更新时间间隔(默认30秒) > eureka.instance.lease-expiration-duration-in-seconds # 续约到期时间(默认90秒) 生产环境建议采用默认配置,服务停止到注册中心清除实例之间有一些计算什么的。****

猜你喜欢

转载自blog.51cto.com/13883927/2152229