一:服务的注册与发现
springcloud alibaba 使用 naocs 组件 完成 对服务的注册与发现,先下载nacos压缩包,然后解压,运行bin目录中的 startup.cmd
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHLxEEVPpXRU5UMFpHW4Z0MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL1kDN5MDMzQTM3AzNwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
浏览器地址栏 输入 localhost:8848/nacos/ 进行访问, 默认账号密码均是 nacos
在项目中引入nacos的依赖
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
修改配置文件,将微服务注册到nacos中
# 指定服务名
spring.application.name=order
# 指定nacos的服务器地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
# 指定服务名
spring.application.name=product
# 指定nacos的服务器地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
然后刷新nacos页面。会发现服务已经被发现
使用 DiscoveryClient 对象 获取nacos 上的服务器信息,并且改写请求的路径
之前的请求路径
修改后的路径
重启服务,进行测试
对于以后的项目而言,不可能只有一个微服务,所以应该将一个微服务部署成集群模式,这样就不能使用之前的代码,固定的获取到第一个微服务,而是要根据一定的策略进行微服务集群的访问。创建product 微服务的 集群
将新创建的 productMain02 运行, 查看 nacos 是否已经注册
手动编写规则,定义随机选择 微服务服务器进行访问
重启微服务,进行测试,查看是否随机进行微服务的选择
第一次进入到8082中
第二次进入到 8081中
第三次仍然是 8081
这种手动进行服务器的选择很麻烦,我们使用Ribbon组件进行服务器的自动选择,在我们引入的nacos 依赖中,已经包含了 Ribbon组件的 依赖,我们只需要在创建 RestTemplate对象的方法上计入注解 @LoadBalanced 即可使用,并将 请求的路径 修改,Ribbon 默认会使用 轮询的策略 对微服务进行访问
/**
* @program: springcloud001
* @description:
* @author: mitu_echo
* @create: 2021-07-06 20:52
**/
package com.hyn.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.hyn.dao.OrderDao;
import com.hyn.entity.Order;
import com.hyn.entity.Product;
import com.hyn.service.OrderService;
import com.hyn.utils.ResultData;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
@Service
public class OrderServiceImpl implements OrderService {
@Autowired
private OrderDao orderDao;
@Autowired
private ResultData<Order> resultData;
@Autowired
private RestTemplate restTemplate;
@Override
public ResultData<Order> doCreatOrder(Integer pid, Integer number) {
ResultData data = restTemplate.getForObject("http://product/product/queryById?pid=" + pid, ResultData.class);
String string = JSON.toJSONString(data.getObject());
Product product = JSONObject.parseObject(string, Product.class);
Order order = new Order();
order.setUid(1001);
order.setUsername("mitu_echo");
order.setPprice(product.getPprice());
order.setPname(product.getPname());
order.setPid(pid);
order.setNumber(number);
int i = orderDao.insert(order);
if (i>0) {
resultData.setCode(200);
resultData.setMsg("创建订单成功");
resultData.setObject(order);
} else {
resultData.setCode(000);
resultData.setMsg("创建订单失败");
}
return resultData;
}
}
二:使用openfeign进行对微服务的访问
使用 openfeign 进行微服务直接的访问,而不使用 RestTemplate 这样更加符合我们调用服务的习惯,使用对象去调用方法,即可完成服务的调用
首先要引入 openfeign 的依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> <version>2.2.5.RELEASE</version> </dependency>
将之前使用的 注解 以及创建的 RestTemplate 删除,在主启动类加入注解 @EnableFeignClients
创建一个 openfeign 包,在包下创建一个调用服务的接口,里面实现对另一个微服务的调用,在接口的名上加入注解 @FeignClient 注解内要写入 需要调用的微服务在nacos中的服务名
里面可以直接写要调用的微服务的controller层中的方法 但是 在接收参数的时候 ,需要加上 @RequestParam 注解,否则会无法接收参数,并且里面的请求路由要完全相同,
在service层中,可以将之前的代码都删除,然后引入ProductFeign接口对象,直接用对象调用方法即可。
@Service
public class OrderServiceImpl implements OrderService {
@Autowired
private OrderDao orderDao;
@Autowired
private ResultData<Order> resultData;
@Autowired
private ProductFeign productFeign;
@Override
public ResultData<Order> doCreatOrder(Integer pid, Integer number) {
ResultData<Product> data = productFeign.doQueryById(pid);
String string = JSON.toJSONString(data.getObject());
Product product = JSONObject.parseObject(string, Product.class);
Order order = new Order();
order.setUid(1001);
order.setUsername("mitu_echo");
order.setPprice(product.getPprice());
order.setPname(product.getPname());
order.setPid(pid);
order.setNumber(number);
int i = orderDao.insert(order);
if (i>0) {
resultData.setCode(200);
resultData.setMsg("创建订单成功");
resultData.setObject(order);
} else {
resultData.setCode(000);
resultData.setMsg("创建订单失败");
}
return resultData;
}
}
重启服务,进行测试。
使用 openfeign 进行服务之间的调用时,也支持Ribbon选择调用服务器的策略,不修改默认就是轮询