Spring Cloud基于Eureka的微服务集群实现 - theseus - ITeye博客

      在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文件中加入以下依赖

Xml代码  收藏代码 "收藏这段代码")

  1. <dependency>
  2.     <groupId>org.springframework.cloud</groupId>
  3.     <artifactId>spring-cloud-starter-eureka</artifactId>
  4. </dependency>
  5. <dependency>
  6.     <groupId>org.springframework.cloud</groupId>
  7.     <artifactId>spring-cloud-starter-eureka-server</artifactId>
  8. </dependency>

<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具体配置如下:

Java代码  收藏代码 "收藏这段代码")

  1. server:  
  2.   port: 8761
  3. spring:  
  4.   application:  
  5.     name: EurekaServer  
  6. eureka:  
  7.   instance:  
  8.     hostname: peer1 #对应的hostname  
  9.   client:  
  10.     service-url:  
  11.       defaultZone: #三个服务节点互联  
  12.         http://peer1:8761/eureka/,http://peer2:8762/eureka/,http://peer3:8763/eureka/

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服务注解

Java代码  收藏代码 "收藏这段代码")

  1. @SpringBootApplication
  2. @EnableEurekaServer
  3. publicclass EurekaServerApp {  
  4.     publicstaticvoid main(String[] args) {  
  5.         SpringApplication.run(EurekaServerApp.class, args);  
  6.     }  
  7. }  

@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,并打印出当前调用服务的信息

Java代码  收藏代码 "收藏这段代码")

  1. @RestController
  2. publicclass AppServiceController {  
  3.     privatefinal Logger logger = LoggerFactory.getLogger(getClass());  
  4.     @Autowired
  5.     private DiscoveryClient client;  
  6.     @SuppressWarnings("deprecation")  
  7.     @RequestMapping("/hello/{user}")  
  8.     public String hello(@PathVariable("user") String user) {  
  9.         ServiceInstance instance = client.getLocalServiceInstance();  
  10.         logger.info("/add, host:" + instance.getHost() + ", port: " + instance.getPort() + ", service_id:"
  11.                 + instance.getServiceId() + ", user:" + user);  
  12.         return"Hello " + user;  
  13.     }  
  14. }  

@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中添加以下依赖

Xml代码  收藏代码 "收藏这段代码")

  1. <dependency>
  2.     <groupId>org.springframework.cloud</groupId>
  3.     <artifactId>spring-cloud-starter-eureka</artifactId>
  4. </dependency>
  5. <dependency>
  6.     <groupId>org.springframework.cloud</groupId>
  7.     <artifactId>spring-cloud-starter-ribbon</artifactId>
  8. </dependency>

<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集群中注册

Java代码  收藏代码 "收藏这段代码")

  1. spring:  
  2.   application:  
  3.     name: eureka-client  
  4. eureka:  
  5.   client:  
  6.     register-with-eureka: false
  7.   server:  
  8.     name: eurekaServer  

spring:
application:

name: eureka-client

eureka:
client:

register-with-eureka: false

server:

name: eurekaServer

 8、客户端的主类中通过服务名访问Eureka集群,默认负载均衡策略为轮询

Java代码  收藏代码 "收藏这段代码")

  1. @SpringBootApplication
  2. @EnableDiscoveryClient
  3. @RestController
  4. publicclass EurekaClientApp {  
  5.     @Bean
  6.     @LoadBalanced
  7.     RestTemplate restTemplate() {  
  8.         returnnew RestTemplate();  
  9.     }  
  10.     @Value("${eureka.server.name}")  
  11.     private String eurekaServer;  
  12.     @Autowired
  13.     RestTemplate restTemplate;  
  14.     @RequestMapping(value = "/{user}")  
  15.     public String hello(@PathVariable("user") String user) {  
  16.         return restTemplate.getForEntity("http://" +eurekaServer +"/hello/"+ user, String.class).getBody();  
  17.     }  
  18.     publicstaticvoid main(String[] args) {  
  19.         SpringApplication.run(EurekaClientApp.class, args);  
  20.     }  
  21. }  

@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


Original url: Access
Created at: 2019-04-22 11:15:41
Category: default
Tags: none

请先后发表评论
  • 最新评论
  • 总共0条评论