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

it2022-05-05  183

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

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


最新回复(0)