Spring Cloud微服务架构——Eureka服务发现与消费

在第一篇文章里,我们创建了Eureka服务注册中心(商场),文章地址:Spring Cloud微服务架构——Eureka注册中心

在第二篇文章里,我们创建了Eureka服务提供者(海底捞),并且已经注册到注册中心(入驻到了商场),文章地址:Spring Cloud微服务架构——Eureka服务注册

本篇文章,将介绍服务发现并消费。

服务发现与消费

举个例子,周末出门逛商场,来到商场大门口看到门前的广告牌上有海底捞的广告,正好这时候也饿了,随即就去海底捞吃饭了。这个“看到广告牌上有海底捞的广告”的动作就称为服务发现。这个“去海底捞吃饭”的动作就称为服务消费。在这里,顾客扮演了服务消费者的角色,商场扮演了注册中心的角色,海底捞扮演了服务提供者的角色。可以参考下面的图来理解此场景。

Spring Cloud微服务架构——Eureka服务发现与消费_第1张图片

创建服务消费者

与之前的文章相同步骤快速构建Spring Boot工程。

  • 创建完毕后,修改pom文件如下:
    
        org.springframework.boot
        spring-boot-starter-parent
        1.3.5.RELEASE
         
    
    com.jqcode
    eureka-consumer
    0.0.1
    eureka-consumer
    eureka-consumer

    
        1.8
    

    
        
            org.springframework.boot
            spring-boot-starter
        

        
            org.springframework.cloud
            spring-cloud-starter-eureka
        

        
            org.springframework.boot
            spring-boot-starter-test
            test
            
                
                    org.junit.vintage
                    junit-vintage-engine
                
            
        
    

    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
            
        
    

    
        
            
                org.springframework.cloud
                spring-cloud-dependencies
                Brixton.RELEASE
                pom
                import
            
        
    
  • 启动类添加@EnableDiscoveryClient注解,并构建RestTemplate的Bean实例。
@EnableDiscoveryClient      // 添加应用服务发现的能力
@SpringBootApplication
public class EurekaConsumerApplication {

    @Bean       // 构建RestTemplate Bean实例
    @LoadBalanced   // 开启客户端的负载均衡
    RestTemplate restTemplate(){
        return new RestTemplate();
    }

    public static void main(String[] args) {
        SpringApplication.run(EurekaConsumerApplication.class, args);
    }

}
  • 创建服务消费者类
@RestController
public class ConsumerController {

    // 服务端列表,此处的FOOD-SERVICE为服务提供者在Eureka注册中心注册的服务名
    private static final String SERVICE_URL = "http://FOOD-SERVICE/eat?customerName=小白";

    @Autowired
    private RestTemplate restTemplate;      // 通过RestTemplate进行RPC远程调用

    @RequestMapping(value = "/consume", method = RequestMethod.GET)
    public String consume() {
        return restTemplate.getForEntity(SERVICE_URL, String.class).getBody();
    }

}

在这里,可以看到服务地址是http://FOOD-SERVICE/eat?customerName=小白,这里是通过服务名进行调用的,因为在服务注册清单中,服务名与对应服务实例元信息是绑定在一起的,我们通过服务名直接调用就行了。

再看启动类,可能有人会对@LoadBalanced注解比较好奇,此注解可以让我们通过服务名调用,如果不加此注解又通过服务名去调用会报找不到服务的错误,这样的话就只能通过ip:port的形式去调用了,这就脱离了服务注册中心的概念,相当于点对点的直接调用,没什么意义,所以大家还是把这个注解加上。

可以参考此篇文章对@LoadBalanced的解释:@LoadBalanced注解

  • 修改application.properties配置文件
#消费者服务启动端口
server.port=9100
#消费者服务名称
spring.application.name=consumer
#Eureka注册中心服务地址
eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka
  • 启动项目,访问地址:http://localhost:9100/consume

Spring Cloud微服务架构——Eureka服务发现与消费_第2张图片

至此,我们就完成了从服务注册清单中发现服务并进行服务消费!

你可能感兴趣的:(java相关)