本帖最后由 大蓝鲸小蟀锅 于 2018-3-24 15:27 编辑
[南京校区] Spring Cloud服务发现框架Eureka配置 在 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-itheima-10086.com # 定义 Eureka 实例所在的主机名称
3、修改 hosts 配置文件,追加 eureka 的映射地址。 127.0.0.1 eureka-itheima-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-itheima-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:
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: register-with-eureka: false # 当前的微服务不注册到eureka之中 fetch-registry: false # 不通过eureka获取注册信息 instance: # eureak实例定义 hostname: eureka-itheima-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: 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"}} |