前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringCloud之服务调用

SpringCloud之服务调用

作者头像
用户3467126
发布2019-07-03 18:16:51
4470
发布2019-07-03 18:16:51
举报
文章被收录于专栏:爱编码爱编码
简介

SpringCloud的服务调用有两个东西: Ribbon是一个客户端的负载均衡器,它提供对大量的HTTP和TCP客户端的访问控制。Feign也是用的Ribbon。

原理分析

ribbon实现的关键点是为ribbon定制的RestTemplate,ribbon利用了RestTemplate的拦截器机制,在拦截器中实现ribbon的负载均衡。负载均衡的基本实现就是利用applicationName从服务注册中心获取可用的服务地址列表,然后通过一定算法负载,决定使用哪一个服务地址来进行http调用。

详情可参考这篇文章 https://dwz.cn/8qTlk58v

使用

总体流程如下图:

服务提供者

注:这里需要有个服务注册与发现的注册中心,参考上一篇【SpringCloud之Eureka】

创建一个服务提供者: 1.pom.xml文件

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>cn.xbmchina</groupId>
        <artifactId>cloud-parent</artifactId>
        <version>1.0-SNAPSHOT</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>cn.xbmchina</groupId>
    <artifactId>cloud-eureka-client</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>cloud-eureka-client</name>
    <description>一个服务提供者</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

2.写接口提供给外部调用 这里用到@EnableEurekaClient注解,就是说将这个模块向eureka-server端注册,以便其他模块可以发现该服务。

代码语言:javascript
复制
@SpringBootApplication
@EnableEurekaClient
@RestController
public class CloudEurekaClientApplication {

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

    @Value("${server.port}")
    String port;

    @RequestMapping("/hi")
    public String home(@RequestParam(value = "name", defaultValue = "zero") String name) {
        return "hi " + name + " ,i am from port:" + port;
    }
}

3.配置文件连接到eureka服务端 注:application.name=cloud-eureka-client在下面的其他模块调用时是有用处的。

代码语言:javascript
复制
server:
  port: 8762

spring:
  application:
    name: cloud-eureka-client

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
服务消费者

使用ribbon版

1.pom.xml文件,添加相关依赖

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>cn.xbmchina</groupId>
        <artifactId>cloud-parent</artifactId>
        <version>1.0-SNAPSHOT</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>cn.xbmchina</groupId>
    <artifactId>cloud-service-ribbon</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>cloud-service-ribbon</name>
    <description>一个服务消费者</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>
    </dependencies>
</project>

2.利用RestTemplate 调用CLOUD-EUREKA-CLIENT上面定义的服务提供接口 注: @LoadBalanced :是为了负载均衡用的。就是说你如果有几台机都是同一接口的话,它会轮流的调用。

代码语言:javascript
复制
@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
@EnableHystrix
@RestController
public class CloudServiceRibbonApplication {

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


    @Bean
    @LoadBalanced  //负载均衡
    RestTemplate restTemplate() {
        return new RestTemplate();
    }

    @Autowired
    RestTemplate restTemplate;

    @GetMapping(value = "/hi")
    public String hi(@RequestParam String name) {
        return restTemplate.getForObject("http://CLOUD-EUREKA-CLIENT/hi?name="+name,String.class);
    }
}

3.配置文件连接到eureka服务端 注:application.name=cloud-eureka-client在下面的其他模块调用时是有用处的。

代码语言:javascript
复制
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
server:
  port: 8764
spring:
  application:
    name: cloud-service-ribbon

使用Feign版 其实原理跟ribbon没啥差异,与上面不同的地方:

  • 它是用接口来弄的
  • 使用注解@EnableFeignClients

1.pom.xml 依赖

代码语言:javascript
复制
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
    </dependencies>

2.在启动类中加入@EnableFeignClients注解

代码语言:javascript
复制
@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
@EnableFeignClients
public class CloudServiceFeginApplication {
    public static void main(String[] args) {
        SpringApplication.run(CloudServiceFeginApplication.class, args);
    }
}

3.调用服务 注:这个是接口;@FeignClient中的值是服务端的名称。

代码语言:javascript
复制
@FeignClient(value = "cloud-eureka-client")
public interface TestService {

    @RequestMapping(value = "/hi",method = RequestMethod.GET)
    String helloworld(@RequestParam(value = "name") String name);

}

源码参考GitHub: https://github.com/xbmchina/cloudparent

总结

服务调用类似于用一个浏览器去调用服务器的接口然后接收或传递数据进行下一步的处理,不过这里是可以相互调用。 场景: 比如很多的电商网站有订单模块,仓库模块,支付模块等之间的相互调用。例如:生成订单,然后仓库模块减少,然后支付模块收到钱,接着通知仓库模块安排配送等。

用SpringCloud的分开各个模块,各负其职,这就是微服务的意义之一。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-04-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 爱编码 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 原理分析
  • 使用
    • 服务提供者
      • 服务消费者
      • 总结
      相关产品与服务
      负载均衡
      负载均衡(Cloud Load Balancer,CLB)提供安全快捷的流量分发服务,访问流量经由 CLB 可以自动分配到云中的多台后端服务器上,扩展系统的服务能力并消除单点故障。负载均衡支持亿级连接和千万级并发,可轻松应对大流量访问,满足业务需求。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档