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

 

猜你喜欢

转载自theseus.iteye.com/blog/2368802