增加订单服务
一、新建项目:
1、创建order_service项目
2、开发伪下单接口
3、使用ribbon. (类似httpClient,URLConnection)
启动类增加注解
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
4、根据名称进行调用商品,获取商品详情
二、操作方法:
1、file->new->project
Spring Initializer ->default
点击next
2、输入
Group 项目名称一般为因为小写字母和数字结合luhq7.xdclass luhq7学习xdclass过程中增加的项目名称
Artifact 具体组件 小写字母组合 order_server
Type 选择 Maven Project
其他的默认
点击next
3、选择web
勾选web
3、选择Cloud Discovery (服务发现)
勾选Eureke Discovery
勾选web
勾选ribbon
默认选择 spring boot版本
点击next
4、点击Finish
5、点击New windows
6、在file下setting-> Maven 设置Maven home directory 设置为maven
User setting file 设置为本地Maven中的setting
7、开发下单接口
增加三个package:controller、domain、service并在service下增加一个impl包
在domain包下增加ProductOrder类并序列化( implements Serializable)
增加属性,并增加属性对应的setter和getter
private int productId;
private String productName;
private String tradeNo;
private int price;
private Date createTime;
private int userId ;
private String userName;
在service包下增加类ProductOrderService,类型(kind)为interface
并增加save方法
/**
* 下单接口
* @param userId
* @param productId
* @return
*/
ProductOrder save(int userId,int productId);
在impl包下增加类ProductOrderServiceImpl并实现ProductOrderService,使用implements ProductOrderService
@Service 注释为服务发现,系统自动扫描到,实现代码为:
@Autowired #引用RestTemplate
private RestTemplate restTemplate;
@Override
public ProductOrder save(int userId, int productId) {
//获取商品详情TODO
//
// Object object=restTemplate.getForObject("http://product-service/api/v1/product/findById?id="+productId,Object.class);
//System.out.print(object);
//正式获取接口数据
//第一种获取方式
Map<String,Object> productMap = restTemplate.getForObject("http://product-service/api/v1/product/findById?id="+productId,Map.class);
//第二种获取方式
// ServiceInstance instance=loadBalancerClient.choose("product-service");
// String url=String.format("http://%s:%s/api/v1/product/findById?id="+productId,instance.getHost(),instance.getPort());
// RestTemplate restTemplate=new RestTemplate();
// Map<String,Object> productMap = restTemplate.getForObject(url,Map.class);
ProductOrder productOrder=new ProductOrder();
productOrder.setCreateTime(new Date());
productOrder.setUserId(userId);
productOrder.setProductId(productId);
productOrder.setTradeNo(UUID.randomUUID().toString());
productOrder.setProductName(productMap.get("name").toString());
productOrder.setPrice(Integer.parseInt(productMap.get("price").toString()));
return productOrder;
}
在public class OrderserverApplication应用群里增加引用,实现负载均衡。
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
在controller包中增加类OrderController,增加注释:
@RestController
@RequestMapping("/api/v1/order")
增加服务,并和后台方法关联:
@Autowired
private ProductOrderService productOrderService;
@RequestMapping("save")
public Object save( @RequestParam("userId") int userId,@RequestParam("productId") int productId)
{
System.out.print(userId);
return productOrderService.save(userId,productId);
}
8、找到src->main->resources->application.properties修改名为application.yml
右键 refactor->rename录入application.yml
server:
port: 8769
eureka:
client:
service-url:
defaultZone: http://localhost:7880/eureka
spring:
application:
name: order-service
9、 在配置文件yml里面,自定义负载均衡策略
#自定义负载均衡策略
product-service:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
策略选择:
1、如果每个机器配置一样,则建议不修改策略 (推荐)
2、如果部分机器配置强,则可以改为 WeightedResponseTimeRule