springcloud(三)------服务消费者

本文介绍了如何创建SpringCloud服务消费者,通过配置文件、启动类以及使用RestTemplate进行服务调用。消费者利用LoadBalancerClient进行负载均衡选择服务提供者的地址,实现了对多个服务提供者的接口调用。在实际操作中,模拟了下单场景,展示了消费者成功调用服务提供者的更新库存接口,并在控制台显示出调用结果。
摘要由CSDN通过智能技术生成

1 创建 消费者

创建springboot,命名为:eureka-consumer,引入主要依赖

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-eureka</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
</dependencies>
<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Dalston.SR1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

2 配置文件

# 制定erueka 注册中心
spring.application.name=eureka-consumer
server.port=2101

eureka.client.serviceUrl.defaultZone=http://localhost:1001/eureka/

swagger.show=@swagger.show@
## 主数据源配置
spring.datasource.driver-class-name=@datasource.driver@
spring.datasource.url=@datasource.url@
spring.datasource.username=@datasource.username@
spring.datasource.password=@datasource.password@
spring.datasource.max-idle=10
spring.datasource.max-wait=10000
spring.datasource.min-idle=5
spring.datasource.initial-size=5

mybatis.mapperLocations=classpath:mybatis/*.xml

3 启动类

比提供服务方多了一个 restTemplate,通过这个调用远端服务。

@EnableDiscoveryClient // 将当期应用加入到服务治理体系中
@SpringBootApplication
@MapperScan("com.example.eurekaconsumer.dao")
public class EurekaConsumerApplication {
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
    public static void main(String[] args) {
       // SpringApplication.run(EurekaConsumerApplication.class, args);
        new SpringApplicationBuilder(EurekaConsumerApplication.class).web(true).run(args);

    }

}

4 消费

@Controller
@RequestMapping(value = "/order")
public class OrderController {
    @Resource
    UserMapper userMapper;
    @Resource
    OrderMapper orderMapper;
    @Resource
    ProductMapper productMapper;

    @Autowired
    LoadBalancerClient loadBalancerClient; // 根据服务名称,负载均衡选择服务方
    @Autowired
    RestTemplate restTemplate;

    @RequestMapping(value = "/deal",method = RequestMethod.POST)
    public String dealOrder(Model model, @RequestParam("productId") String productId,
               @RequestParam("price") String price,@RequestParam("sum") String sum){
        Map<String,String> map = new HashMap<>();
        map.put("productId",productId);
        map.put("sum",sum);
        // 调用库存服务,更新库存信息
        ServiceInstance serviceInstance = loadBalancerClient.choose("eureka-client");
        String url = "http://" + serviceInstance.getHost() + ":" + serviceInstance.getPort() + "/productRepo";
        Object obj = restTemplate.getForObject(url, String.class);
        System.out.println(" 收到"+url+"远程调用返回的结果:"+obj);
        // 调用积分服务,更新积分信息(待添加)

        // 处理需求购买一个苹果手机,需要 更新库存信息和 个人积分信息
        List<ProductInfo> productInfoList = productMapper.selectAll();
        model.addAttribute("productInfoList",productInfoList);
        return "index";
    }

}

LoadBalancerClient 先 获取要调用服务的地址和端口号,当然,对于我们两个服务方,这个接口会负载均衡的选择,choose 选择服务名
restTemplate 具体的实行调用。/productRepo 是对方的接口。
写的有点乱,凑合看吧。
我自己还写了许多页面,假装调用一下,点击 下单,调用的就是这个接口

在这里插入图片描述
查看两个服务方控制台:
2001 端口的服务

调用本服务的消费方:Services: [eureka-consumer, eureka-client]
==================> 的更新库存信息接口被调用了
调用本服务的消费方:Services: [eureka-consumer, eureka-client]
==================> 的更新库存信息接口被调用了

2002 端口的服务:

调用本服务的消费方:Services: [eureka-consumer, eureka-client]
==================> 的更新库存信息接口被调用了
调用本服务的消费方:Services: [eureka-consumer, eureka-client]
==================> 的更新库存信息接口被调用了
调用本服务的消费方:Services: [eureka-consumer, eureka-client]
==================> 的更新库存信息接口被调用了

消费者方控制台:

收到http://localhost:2002/productRepo远程调用返回的结果:success
收到http://localhost:2002/productRepo远程调用返回的结果:success
收到http://localhost:2001/productRepo远程调用返回的结果:success服务1
收到http://localhost:2002/productRepo远程调用返回的结果:success
收到http://localhost:2001/productRepo远程调用返回的结果:success服务1

这样一个简单的分布式调用就成了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值