天天看點

Spring Cloud基于Eureka的微服務叢集實作

      在 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

繼續閱讀