在 SpringCloud 之中使用了大量的Netflix 的开源项目,而其中 Eureka 就属于Netflix 提供的发现服务组件,所有的微服务在使用之中全部向 Eureka 之中进行注册,而后客户端直接利用 Eureka 进行服务信息的获取。
Eureka服务端配置:
1、在pom.xml追加相应的依赖支持库,这里新建的是一个maven新项目
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId> org.mybatis.spring.boot</groupId>
<artifactId> mybatis-spring-boot-starter</artifactId>
</dependency>
2、修改加载配置文件,这里使用的是yml文件配置,在这个配置文件里面主要进行 eureka 服务的定义。
server:
port: 10086
eureka:
instance: # eureak实例定义
hostname: eureka-hezhiyu-10086.com # 定义 Eureka 实例所在的主机名称
3、修改 hosts 配置文件,追加 eureka 的映射地址。
127.0.0.1 eureka-hezhiyu-10086.com
4、修改 Eureka 程序启动类,追加有 Eureka 服务声明
importorg.springframework.boot.SpringApplication;
importorg.springframework.boot.autoconfigure.SpringBootApplication;
importorg.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
publicclass Eureka_10086_StartSpringCloudApplication {
public static void main(String[] args){
SpringApplication.run(Eureka_10086_StartSpringCloudApplication.class,args);
}
}
5、访问路径:http:// eureka-hezhiyu-10086.com:10086/
向 Eureka 中注册微服务
现在 Eureka 已经可以正常启用了,那么就需要在项目之中将所有的微服务信息注册到 Eureka 服务之中,这样就可以被客户端执行并且调用了。
1、客户端修改 pom.xml 配置文件,追加有eureka 的相关依赖支持包;
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
2、修改 application.yml 配置文件,在这个配置文件之中主要是定义要进行注册的 Eureka 服务的地址,而这个地址就是 Eureka 的客户端配置。
eureka:
client: # 客户端进行Eureka注册的配置
service-url:
defaultZone: http://eureka-hezhiyu-10086.com:10086/eureka
3、修改项目的运行主类,在这个主类上追加有Eureka 客户端的启用注解:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableEurekaClient
public class Client_StartSpringCloudApplication {
public static void main(String[] args) {
SpringApplication.run(Client_StartSpringCloudApplication.class,args);
}
}
此时由于存在有“@EnableEurekaClient”注解信息,所以当服务启动之后该服务会自动注册到Eureka服务器之中;
4、修改application.yml配置文件,为此微服务设置一个名字(这个名字将作为日后负载均衡)
spring:
application:
name: cloud-provider-client
Eureka 发现管理
在实际的项目运行过程之中需要通过 Eureka 作为所有微服务的监控处理程序,但是对于监控程序那么就必然要面临以下问题:
· 新服务追加的时候应该立刻可以进行注册;
· 当某一个服务下线之后应该可以进行清理;
1、修改Eureka项目设置服务的清理间隔,修改 application.yml 配置文件
server:
port: 10086
spring:
application:
name: cloud-provider-client.com
eureka:
server:
eviction-interval-timer-in-ms: 1000 # 设置清理的间隔时间,而后这个时间使用的是毫秒单位(默认是60秒)
client: # 客户端进行Eureka注册的配置
service-url:
defaultZone:http://eureka-hezhiyu-10086.com:10086/eureka
register-with-eureka: false # 当前的微服务不注册到eureka之中
fetch-registry: false # 不通过eureka获取注册信息
instance: # eureak实例定义
hostname: eureka-hezhiyu-10086.com # 定义 Eureka 实例所在的主机名称
一旦配置了清理的间隔为 1 秒的时间,则会在每秒的时候进行一次服务的清理过程,会出现如下错误提示信息:
10:58:44.894 INFO 6628 ---[a-EvictionTimer] c.n.e.registry.AbstractInstanceRegistry :
Running the evict task withcompensationTime 0ms
一般情况下,该配置不建议进行修改,默认就是 60 秒,也就是说你的微服务如果 60 秒没有心跳了,那么就认为可以清理掉。
2、在 Eureka 里面有一个问题,这个问题就是它默认支持有保护模式的概念,所谓的保护模式指的是即便现在某一个微服务不可用了,eureka 不会清理,依然会进行该微服务信息的保存。
如果现在要想去改变这种保护模式的启用,则可以修改 application.yml 配置文件:
enable-self-preservation: false # 设置为false表示关闭保护模式
3、微服务客户端之所以可以与 Eureka 之间保持联系,依靠的是心跳机制,也就是说你客户端 可以自己来进行心跳的配置处理,修改 application.yml 配置文件:
eureka:
client: # 客户端进行Eureka注册的配置
service-url:
defaultZone:http://eureka-hezhiyu-10086.com:10086/eureka
instance:
lease-renewal-interval-in-seconds: 2 # 设置心跳的时间间隔(默认是30秒)
lease-expiration-duration-in-seconds: 5 # 如果现在超过了5秒的间隔(默认是90秒)
instance-id: cloud-provider-client.com # 在信息列表时显示主机名称
prefer-ip-address: true # 访问的路径变为 IP 地址
4、测试:现在对于注册到 Eureka 上的微服务端也可以通过发现服务来进行一些服务信息的获取
import javax.annotation.Resource;
importjavax.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.PathVariable;
importorg.springframework.web.bind.annotation.RequestBody;
importorg.springframework.web.bind.annotation.RequestMapping;
importorg.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
importcn.mldn.microcloud.service.IDeptService;
import cn.mldn.vo.Dept;
@RestController
public class DeptRest {
@Resource
privateIDeptService deptService ;
@RequestMapping("/dept/sessionId")
publicObject id(HttpServletRequest request) {
returnrequest.getSession().getId() ;
}
@RequestMapping(value="/dept/get/{id}",method=RequestMethod.GET)
publicObject get(@PathVariable("id") long id) {
returnthis.deptService.get(id) ;
}
@RequestMapping(value="/dept/add",method=RequestMethod.POST)
publicObject add(@RequestBody Dept dept) {
returnthis.deptService.add(dept) ;
}
@RequestMapping(value="/dept/list",method=RequestMethod.GET)
publicObject list() {
returnthis.deptService.list() ;
}
}
5、在微服务客户端启动类上加上@EnableDiscoveryClient启用 Eureka 发现服务项
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
public class Client_StartSpringCloudApplication {
public static void main(String[] args) {
SpringApplication.run(Client_StartSpringCloudApplication.class,args);
}
}
访问到通过调用Eureka管理后的数据:
{"services":[],"localServiceInstance":{"host":"192.168.31.247",
"port":10086,"secure":false,"serviceId":"cloud-provider-client","metadata":{},"uri":"http://192.168.31.247:10086"}}