Spring Cloud为服务治理做了一层抽象接口,所以在Spring Cloud应用中可以支持多种不同的服务治理框架,如Netflix Eureka、Consul和Zookeeper。在Spring Cloud服务治理抽象层的作用下,可以无缝地切换服务治理实现,并且不影响任何其他的服务注册、服务发现、服务调用等逻辑。
Spring Cloud Eureka是Spring Cloud Netflix项目下的服务治理模块。而Spring Cloud Netflix项目是Spring Cloud的子项目之一,主要内容是对Netflix公司一系列开源产品的包装,它为Spring Boot应用提供了自配置的Netflix OSS整合。通过一些简单的注解,开发者就可以快速的在应用中配置一下常用模块并构建庞大的分布式系统。它主要提供的模块包括:服务发现(Eureka),断路器(Hystrix),智能路由(Zuul),客户端负载均衡(Ribbon)等。
一 下面通过一个简单的例子来尝试下Spring Cloud Eureka ,步骤如下:
1.创建Spring Boot项目,命名eureka,pom文件中还需要添加:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
---
2.新建Application主类:
@EnableEurekaServer @SpringBootApplication public class Application { public static void main( String[] args ) { SpringApplication.run(Application.class, args); } }
---通过@EnableEurekaServer
激活服务注册中心
3.添加配置文件application.properties文件:
spring.application.name=eureka
server.port=8001
eureka.instance.hostname=localhost
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
---默认设置下,注册中心会将自己作为客户端来注册自己,通过以上红色配置可关闭该行为。
4.启动服务,然后使用浏览器访问http://localhost:8001/ ,可查看服务监控页面,此时注册实例为空。
二 接下来创建两个服务提供者,并注册在Eureka上。
1.新建Spring Boot项目,命名client1, 增加pom依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
---
2.添加主类
@EnableDiscoveryClient @SpringBootApplication public class App { public static void main( String[] args ) { SpringApplication.run(App.class, args); } }
---通过@EnableDiscoveryClient
激活DiscoveryClient,使Eureka可以发现该服务。
3.添加配置文件application.properties文件
spring.application.name=client server.port=8071 eureka.client.serviceUrl.defaultZone=http://localhost:8001/eureka/
---eureka.client.serviceUrl.defaultZone
属性为服务注册中心的配置,指定服务注册中心的地址
4.添加类InfoController.java
@RestControllerpublic class TestController { @RequestMapping("/info") public String msg() { return "client1 servcie"; } }
---
5.再创建一个一模一样的服务,命名client2,修改端口为8072,启动这两个服务,再访问http://localhost:8001/ ,可见
说明两个服务都已注册成功
三 创建一个服务调用者
1.新建Spring Boot项目,命名consumer,添加pom依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
---
2.新建主类
@EnableDiscoveryClient @SpringBootApplication public class App { @Bean public RestTemplate restTemplate() { return new RestTemplate(); } public static void main( String[] args ) { SpringApplication.run(App.class, args); } }
--- 同样注册在Eureka上
3.添加配置文件
spring.application.name=consumer server.port=8081 eureka.client.serviceUrl.defaultZone=http://localhost:8001/eureka/
--- 指定注册地址
4.添加TestController
@RestController public class TestController { @Autowired LoadBalancerClient loadBalancerClient; @Autowired RestTemplate restTemplate; @GetMapping("/test") public String test() { ServiceInstance serviceInstance = loadBalancerClient.choose("client"); String url = "http://" + serviceInstance.getHost() + ":" + serviceInstance.getPort() + "/info"; return restTemplate.getForObject(url, String.class); } }
--- LoadBalancerClient 可支持负载均衡的client节点选择
5.启动服务,查看Eureka界面
使用浏览器访问 http://localhost:8081/test, 可看到显示client2 service,说明服务调用成功。
有时候重启服务报错说端口占用,则需强杀进程
lsof -i tcp:8081 然后 kill pid
参考 http://projects.spring.io/spring-cloud/spring-cloud.html
end