Spring Cloud入门教程(三)服务调用--Ribbon和Feign

上两章我们讲解了spring-cloud的服务注册发现以及动态刷新配置,这一章我们主要讲解服务的调用。

既然是分布式项目,那么服务之间该采用什么方式去互相调用呢。之前我们使用最多的是Dubbo作为服务间的调用,而Dubbo则是采用的RPC(远程调用服务)来实现的,Spring-cloud 提供两辆种服务调度方式:Ribbon+restful和Feign。Ribbon就是一个基于客户端的负载均衡器, Ribbon提供了很多在HTTP和TCP客户端之上的控制. 

Feign内部也已经使用了Ribbon, 所以只要使用了@FeignClient注解,那么这一章的内容也都是适用的。

下面就看看如何Spring Cloud如何用Ribbon来实现两个Hello World服务的负载均衡。以下是Spring cloud的ribbon客户端负载均衡架构图。

Spring Cloud入门教程(三)服务调用--Ribbon和Feign_第1张图片

1)首先我们在之前的项目基础上再建一个Ribbon服务,pom文件及项目结构如下

pom.xml



    4.0.0

    com.example
    ribbon
    0.0.1-SNAPSHOT
    jar

    ribbon
    Demo project for Spring Boot

    
        com.example
        spring-cloud
        0.0.1-SNAPSHOT
         
    

    
        UTF-8
        UTF-8
        1.8
        Finchley.RELEASE
    

    
        
            org.springframework.cloud
            spring-cloud-starter-netflix-ribbon
        
        
            org.springframework.cloud
            spring-cloud-starter-netflix-eureka-server
        
        
            org.springframework.boot
            spring-boot-starter-web
        
        
            org.springframework.boot
            spring-boot-starter-test
            test
        
    

    
        
            
                org.springframework.cloud
                spring-cloud-dependencies
                ${spring-cloud.version}
                pom
                import
            
        
    

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

    
        
            spring-milestones
            Spring Milestones
            https://repo.spring.io/milestone
            
                false
            
        
    



Spring Cloud入门教程(三)服务调用--Ribbon和Feign_第2张图片

2)配置Ribbon的application.yml文件并在启动类加上@EnableEurekaClient和@EnableDiscoveryClient向服务中心注册

Spring Cloud入门教程(三)服务调用--Ribbon和Feign_第3张图片

Spring Cloud入门教程(三)服务调用--Ribbon和Feign_第4张图片

3)配置一个ResTemplate的Bean,然后编写测试类注入这个Bean,使用RestTemplate的getForObject方法调用eureka-client的方法

Spring Cloud入门教程(三)服务调用--Ribbon和Feign_第5张图片

Spring Cloud入门教程(三)服务调用--Ribbon和Feign_第6张图片

此时启动Ribbon项目并访问localhost:8764/ribbon/test看是否输出正确的值即表示成功

4)上面我们介绍了Ribbon如何调用服务,现在我们则使用Feign来进行服务间的调用。

首先我们还是新建一个Feign的项目,pom文件和项目结构如下



    4.0.0

    com.example
    feign
    0.0.1-SNAPSHOT
    jar

    feign
    Demo project for Spring Boot

    
        com.example
        spring-cloud
        0.0.1-SNAPSHOT
         
    

    
        UTF-8
        UTF-8
        1.8
        Finchley.RELEASE
    

    
        
            org.springframework.cloud
            spring-cloud-starter-openfeign
        
        
            org.springframework.cloud
            spring-cloud-starter-netflix-eureka-server
        

        
            org.springframework.boot
            spring-boot-starter-test
            test
        
    

    
        
            
                org.springframework.cloud
                spring-cloud-dependencies
                ${spring-cloud.version}
                pom
                import
            
        
    

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

    
        
            spring-milestones
            Spring Milestones
            https://repo.spring.io/milestone
            
                false
            
        
    



Spring Cloud入门教程(三)服务调用--Ribbon和Feign_第7张图片

5)我们还是需要配置Feign的applicatio.yml文件,然后在启动类加上@EnableEurekaClient和@EnableFeignClients以及@EnableDiscoveryClient开启服务发现和向服务中心注册

Spring Cloud入门教程(三)服务调用--Ribbon和Feign_第8张图片

Spring Cloud入门教程(三)服务调用--Ribbon和Feign_第9张图片

6)接下来我们创建一个Feign的测试接口,并在Web层创建一个Controller来进行调用

Spring Cloud入门教程(三)服务调用--Ribbon和Feign_第10张图片

Spring Cloud入门教程(三)服务调用--Ribbon和Feign_第11张图片

注意这里在调用服务一方的启动类上需要加上如下注解@EnableFeignClients表示发现服务,并配置服务接口所在的包

Spring Cloud入门教程(三)服务调用--Ribbon和Feign_第12张图片

7)此时启动项目访问localhost:8764/ribbon/feignTest,如果不报错即表示成功

在这里使用Feign会有很多坑,比如我就陷在了命名上面,当时我创建的接口名为feignService,结果一直报如下错误,具体是不是因为命名的问题还有待确定........

由于我也是刚接触spring-cloud,所以文章会有很多不足的地方,如果大家发现有问题欢迎评论,持续改进ing

你可能感兴趣的:(java,springboot)