天天看点

springcloud的服务注册与发现以及服务之间的调用一:服务的注册与发现二:使用openfeign进行对微服务的访问

一:服务的注册与发现

springcloud alibaba 使用 naocs 组件 完成 对服务的注册与发现,先下载nacos压缩包,然后解压,运行bin目录中的 startup.cmd

springcloud的服务注册与发现以及服务之间的调用一:服务的注册与发现二:使用openfeign进行对微服务的访问

浏览器地址栏 输入  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页面。会发现服务已经被发现

springcloud的服务注册与发现以及服务之间的调用一:服务的注册与发现二:使用openfeign进行对微服务的访问

使用 DiscoveryClient 对象 获取nacos 上的服务器信息,并且改写请求的路径

之前的请求路径

springcloud的服务注册与发现以及服务之间的调用一:服务的注册与发现二:使用openfeign进行对微服务的访问

修改后的路径

springcloud的服务注册与发现以及服务之间的调用一:服务的注册与发现二:使用openfeign进行对微服务的访问

重启服务,进行测试

springcloud的服务注册与发现以及服务之间的调用一:服务的注册与发现二:使用openfeign进行对微服务的访问

对于以后的项目而言,不可能只有一个微服务,所以应该将一个微服务部署成集群模式,这样就不能使用之前的代码,固定的获取到第一个微服务,而是要根据一定的策略进行微服务集群的访问。创建product 微服务的 集群

springcloud的服务注册与发现以及服务之间的调用一:服务的注册与发现二:使用openfeign进行对微服务的访问
springcloud的服务注册与发现以及服务之间的调用一:服务的注册与发现二:使用openfeign进行对微服务的访问
springcloud的服务注册与发现以及服务之间的调用一:服务的注册与发现二:使用openfeign进行对微服务的访问

将新创建的 productMain02 运行, 查看 nacos 是否已经注册

springcloud的服务注册与发现以及服务之间的调用一:服务的注册与发现二:使用openfeign进行对微服务的访问

手动编写规则,定义随机选择 微服务服务器进行访问

springcloud的服务注册与发现以及服务之间的调用一:服务的注册与发现二:使用openfeign进行对微服务的访问

重启微服务,进行测试,查看是否随机进行微服务的选择

第一次进入到8082中

springcloud的服务注册与发现以及服务之间的调用一:服务的注册与发现二:使用openfeign进行对微服务的访问

第二次进入到 8081中

springcloud的服务注册与发现以及服务之间的调用一:服务的注册与发现二:使用openfeign进行对微服务的访问

第三次仍然是 8081 

springcloud的服务注册与发现以及服务之间的调用一:服务的注册与发现二:使用openfeign进行对微服务的访问

这种手动进行服务器的选择很麻烦,我们使用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;
    }
}
           
springcloud的服务注册与发现以及服务之间的调用一:服务的注册与发现二:使用openfeign进行对微服务的访问
springcloud的服务注册与发现以及服务之间的调用一:服务的注册与发现二:使用openfeign进行对微服务的访问

二:使用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

springcloud的服务注册与发现以及服务之间的调用一:服务的注册与发现二:使用openfeign进行对微服务的访问

创建一个 openfeign 包,在包下创建一个调用服务的接口,里面实现对另一个微服务的调用,在接口的名上加入注解 @FeignClient 注解内要写入 需要调用的微服务在nacos中的服务名

里面可以直接写要调用的微服务的controller层中的方法 但是 在接收参数的时候 ,需要加上 @RequestParam 注解,否则会无法接收参数,并且里面的请求路由要完全相同,

springcloud的服务注册与发现以及服务之间的调用一:服务的注册与发现二:使用openfeign进行对微服务的访问

在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选择调用服务器的策略,不修改默认就是轮询

aaa