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
这样一个简单的分布式调用就成了。