服务治理 Spring Cloud Eureka
1.简介
Spring Cloud Eureka使用Netflix Eureka来实现服务注册与发现,主要负责完成微服务架构中的服务治理功能。它既包含了服务端组件,也包含了客户端组件,并且服务端与客户端均采用java编写,所以Eureka主要适用于通过java实现的分布式系统,或是JVM兼容语言构建的系统。Eureka的服务端提供了较为完善的REST API,所以Eureka也支持将非java语言实现的服务纳入到Eureka服务治理体系中来,只需要其他语言平台自己实现Eureka的客户端程序。
2.demo
2.1搭建注册中心
2.1.1 新建Spring-boot项目,命名为eureka-server。pom.xml增加Eureka-server的依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
2.1.2应用启动程序类增加 @EnableEurekaServer注解
2.1.3配置yml或者properties
server:
port: 8999
eureka:
instance:
hostname:localhost
client:
register-with-eureka: false //该服务为注册中心,不向注册中心注册自己
fetch-registry: false //注册中心的责任就是维护,不需要去检测服务
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
2.1.4浏览器访问http://localhost:8999 即可访问注册中心,查看注册在其中的服务。当前没有服务。
2.2 注册服务提供者
2.2.1 新建spring-boot项目或者新建子mudule,引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2.2.2 启动类增加@EnableEurekaClient注解表明自己是一个EurekaClient
@SpringBootApplication
@EnableEurekaClient
@RestController
public class ServiceHiApplication {
public static void main(String[] args) {
SpringApplication.run( ServiceHiApplication.class, args );
}
@Value("${server.port}")
String port;
@RequestMapping("/hi")
public String home(@RequestParam(value = "name", defaultValue = "test") String name) {
return "hi " + name + " ,i am from port:" + port;
}
}
2.2.2 修改yml配置文件
server:
port: 8998
spring:
application:
name: service-hi //这个name为服务间调用的标识,请保持唯一
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8999/eureka/
启动这个程序,访问http://localhost:8999会发现多了一个注册的服务,同时,访问http://localhost:8998/hi?name=test1可以看到
Hi test1,i am from port 8998;
3. 高可用注册中心
在微服务架构的分布式环境中,我们需要考虑发生故障的情况,生产环境必须对组件进行高可用部署。Eureka的服务治理设计中所有节点及时读物提供方,也是服务消费方,服务注册中心也可以是这样。Eureka Server的高可用实际上就是想将自己作为服务向其他服务注册中心注册自己,这样形成一组互相注册的服务注册中心,以实现服务清单的互相同步,达到高可用的效果。
3.1 在上一个项目的基础上进行修改,创建application.peer1.yml,作为peer1服务中心的配置,并将serverserviceUrl指向peer2
server:
port: 1111
spring:
application:
name: eureka-server
eureka:
instance:
hostname:
peer1
client:
serviceUrl:
defaultZone: http://localhost:1112/eureka/
3.2 创建application.peer2.yml,作为peer2服务中心的配置,并将serverserviceUrl指向peer1
server:
port: 1112
spring:
application:
name: eureka-server
eureka:
instance:
hostname:
peer1
client:
serviceUrl:
defaultZone: http://localhost:1111/eureka/
3.3 修改hosts文件,添加对peer1和peer2的转换(C:\Windows\Ststem32\drivers\etc\hosts)
127.0.0.1 peer1
127.0.0.1 peer2
3.4 通过spring.profiles.active属性分别启动peer1和peer2。(idea中启动程序是配置参数也可以)
java -jar demo-1.0.0.jar –spring.profiles.active=peer1
java -jar demo-1.0.0.jar –spring.profiles.active=peer2
此时访问localhost:1111就可以看淡peer2的节点,动力1112端口也可以看到peer1节点
- 在设置了多节点的服务注册中心之后,读物提供方还需修改一下defaultZone,如:
eureka:
client:
serviceUrl:
defaultZone: http://peer1:1111/eureka/,http://peer2:1112/eureka/