在 Spring Cloud 中內建了 Eureka ,是以可以在 Spring Boot 項目中使用 Eureka 的分布式服務,在本例中我們模拟 Eureka 的僞分布式的使用,端口分别為 8761( 預設 ),8762,8763 ,同時也需要修改 host 檔案,指定為:
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