Spring Cloud是基于SpringBoot的,为开发人员提供了快速构建分布式系统的一些工具,包括配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等。
在这里,我们需要用的的组件上Spring Cloud Netflix的Eureka ,eureka是一个服务注册和发现模块。
Eureka:
- 是纯正的 servlet 应用,需构建成war包部署
- 使用了 Jersey 框架实现自身的 RESTful HTTP接口
- peer之间的同步与服务的注册全部通过 HTTP 协议实现
- 定时任务(发送心跳、定时清理过期服务、节点同步等)通过 JDK 自带的 Timer 实现
- 内存缓存使用Google的guava包实现
创建过程:
创建完后的工程的pom.xml文件如下(maven创建的包结构POM等,请自行去项目中查看):
springcloud-zureka
com.spring.cloud.zureka
0.0.1
4.0.0
springcloud-zureka-server
jar
UTF-8
UTF-8
1.8
org.springframework.cloud
spring-cloud-starter-eureka-server
${artifactId}
org.springframework.boot
spring-boot-maven-plugin
org.apache.maven.plugins
maven-compiler-plugin
${java.version}
${java.version}
${java.version}
只需要一个注解@EnableEurekaServer,这个注解需要在springboot工程的启动application类上加:
/**
* [@Author](https://my.oschina.net/arthor) lixinhao
* @Description
* [@Date](https://my.oschina.net/u/2504391) 2018/4/13 17:25
*/
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
eureka是一个高可用的组件,它没有后端缓存,每一个实例注册之后需要向注册中心发送心跳(因此可以在内存中完成),在默认情况下erureka server也是一个eureka client ,必须要指定一个 server。eureka server的配置文件appication.yml:
#配置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
创建配置文件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
eureka server 是有界面的,启动工程,打开浏览器访问:http://localhost:8761 ,界面如下:
No instances available 没有服务被发现,接下来创建服务
当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}
通过注解@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 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将会尝试保护其服务注 册表中的信息,不再删除服务注册表中的数据(也就是不会注销任何微服务)
解决方法:
- eureka.server.enable-self-preservation # 设为false,关闭自我保护
- eureka.server.eviction-interval-timer-in-ms # 清理间隔(单位毫秒,默认是60*1000)
- eureka.client.healthcheck.enabled # 开启健康检查(需要spring-boot-starter-actuator依赖)
- eureka.instance.lease-renewal-interval-in-seconds # 续约更新时间间隔(默认30秒)
- eureka.instance.lease-expiration-duration-in-seconds # 续约到期时间(默认90秒)
生产环境建议采用默认配置,服务停止到注册中心清除实例之间有一些计算什么的。
如果你现在在JAVA这条路上挣扎,也想在IT行业拿高薪,可以参加我们的训练营课程,选择最适合自己的课程学习,技术大牛亲授,7个月后,进入名企拿高薪。我们的课程内容有:Java工程化、高性能及分布式、高性能、深入浅出。高架构。性能调优、Spring,MyBatis,Netty源码分析和大数据等多个知识点。如果你想拿高薪的,想学习的,想就业前景好的,想跟别人竞争能取得优势的,想进阿里面试但担心面试不过的,你都可以来,q群号为:779792048
注:加群要求
1、具有1-5工作经验的,面对目前流行的技术不知从何下手,需要突破技术瓶颈的可以加。
2、在公司待久了,过得很安逸,但跳槽时面试碰壁。需要在短时间内进修、跳槽拿高薪的可以加。
3、如果没有工作经验,但基础非常扎实,对java工作机制,常用设计思想,常用java开发框架掌握熟练的,可以加。
4、觉得自己很牛B,一般需求都能搞定。但是所学的知识点没有系统化,很难在技术领域继续突破的可以加。
5.阿里Java高级大牛直播讲解知识点,分享知识,多年工作经验的梳理和总结,带着大家全面、科学地建立自己的技术体系和技术认知!