Spring Cloud基于Eureka的微服务集群实现
127.0.0.1 peer1
127.0.0.1 peer2
127.0.0.1 peer3
1、在Spring Cloud中启用Eureka,需在pom文件中加入以下依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> </dependency>
2、接下来需要修改项目的配置文件,因模拟三个节点,也就需要三个配置文件,其中只是端口号、hostname的指定有所不同,application-s1.yml具体配置如下:
server: port: 8761 spring: application: name: EurekaServer eureka: instance: hostname: peer1 #对应的hostname client: service-url: defaultZone: #三个服务节点互联 http://peer1:8761/eureka/,http://peer2:8762/eureka/,http://peer3:8763/eureka/
application-s2.yml,application-s3.yml中修改对应端口与hostname即可
3、mani函数中加入Eureka服务注解
@SpringBootApplication @EnableEurekaServer public class EurekaServerApp { public static void main(String[] args) { SpringApplication.run(EurekaServerApp.class, args); } }
4、使用maven打包,生成可运行的jar文件,执行以下命令
spring-cloud>java -jar eureka-server\target\eureka-server-0.0.1-SNAPSHOT.jar --spring.profiles.active=s1
spring-cloud>java -jar eureka-server\target\eureka-server-0.0.1-SNAPSHOT.jar --spring.profiles.active=s2
spring-cloud>java -jar eureka-server\target\eureka-server-0.0.1-SNAPSHOT.jar --spring.profiles.active=s3
启动时会报 Connect to peer3:8763 timed out之类的异常,待服务全启动后控制台窗口出现2017-04-12 16:46:14.991 INFO 13132 --- [nio-8761-exec-6] c.n.e.registry.AbstractInstanceRegistry : Registered instance EUREKASERVER/*.*.*.144:EurekaServer:8
763 with status UP (replication=true),说明服务已启动成功,打开http://localhost:8761/,可以看到集群运行正常
注:在配置文件中如果不使用域名的方式,而指定localhost或者ip(127.0.0.1/外网ip),服务能够正常启动,但分片服务总显示在unavailable-replicas中,因此在host中指定了相应的域名做服务区分
5、添加对外服务接口,新建一个controller,并打印出当前调用服务的信息
@RestController public class AppServiceController { private final Logger logger = LoggerFactory.getLogger(getClass()); @Autowired private DiscoveryClient client; @SuppressWarnings("deprecation") @RequestMapping("/hello/{user}") public String hello(@PathVariable("user") String user) { ServiceInstance instance = client.getLocalServiceInstance(); logger.info("/add, host:" + instance.getHost() + ", port: " + instance.getPort() + ", service_id:" + instance.getServiceId() + ", user:" + user); return "Hello " + user; } }
6、新建客户端调用工程,在工程中访问Eureka集群提供的rest服务,该工程是一个普通的Spring Boot项目,pom中添加以下依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-ribbon</artifactId> </dependency>
7、配置文件中将该工程注册属性设置为false,不在Eureka集群中注册
spring: application: name: eureka-client eureka: client: register-with-eureka: false server: name: eurekaServer
8、客户端的主类中通过服务名访问Eureka集群,默认负载均衡策略为轮询
@SpringBootApplication @EnableDiscoveryClient @RestController public class EurekaClientApp { @Bean @LoadBalanced RestTemplate restTemplate() { return new RestTemplate(); } @Value("${eureka.server.name}") private String eurekaServer; @Autowired RestTemplate restTemplate; @RequestMapping(value = "/{user}") public String hello(@PathVariable("user") String user) { return restTemplate.getForEntity("http://" +eurekaServer +"/hello/"+ user, String.class).getBody(); } public static void main(String[] args) { SpringApplication.run(EurekaClientApp.class, args); } }
9、访问http://localhost:8080/tom,页面打印 Hello tom,可以变换参数,在服务端显示访问的日志信息
2017-04-12 18:12:31.888 INFO 13088 --- [nio-8762-exec-3] org.eureka.server.AppServiceController : /add, host:peer2, port: 8762, service_id:EurekaServer, user:tom
2017-04-12 18:13:03.310 INFO 6448 --- [nio-8763-exec-2] org.eureka.server.AppServiceController :
/add, host:peer3, port: 8763, service_id:EurekaServer, user:jack
2017-04-12 18:13:24.342 INFO 12992 --- [nio-8761-exec-6] org.eureka.server.AppServiceController : /add, host:peer1, port: 8761, service_id:EurekaServer, user:anny
访问三次,可以看到服务端分别被访问一次,使用了轮询策略
项目代码地址:https://github.com/hjguang/spring-cloud
该项目中包含其他工程,可以使用以下命令只install Eureka项目
spring-cloud>mvn install -pl eureka-server,eureka-client -DskipTests=true
上一篇: redis客户端命令
下一篇: Thymeleaf在html中的输出
推荐阅读
-
spring cloud 使用Hystrix 实现断路器进行服务容错保护的方法
-
spring cloud实现Eureka注册中心的HA的方法
-
详解Spring Cloud Gateway基于服务发现的默认路由规则
-
基于Nacos实现Spring Cloud Gateway实现动态路由的方法
-
基于Docker的Consul集群实现服务发现
-
Spring Cloud下使用Feign Form实现微服务之间的文件上传
-
基于Spring Cloud的微服务落地
-
基于Spring Boot 2.0.2.RELEASE 的 Spring Cloud 速成指南 | 二. Spring Cloud 服务注册中心(Eureka Server)
-
基于Spring和Spring MVC实现可跨域访问的REST服务(转帖)
-
基于Spring和Spring MVC实现可跨域访问的REST服务(转帖)