nacos、openfeign用法简介

创建两个微服务

用于服务注册、配置和调用demo,目录如下:在这里插入图片描述

micro-service作为父工程,用于依赖管理,pom文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.wdlm</groupId>
    <artifactId>micro-service</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>product</module>
        <module>stock</module>
    </modules>

    <properties>
        <java.version>8</java.version>
        <spring-boot.version>2.3.4.RELEASE</spring-boot.version>
        <spring-cloud.version>Hoxton.SR8</spring-cloud.version>
        <spring-cloud-alibaba.version>2.2.2.RELEASE</spring-cloud-alibaba.version>
    </properties>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.0</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

</project>

product项目和stock项目是两个Springboot工程,代码如下:

product

package com.wdlm.product.pojo;

import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import org.springframework.stereotype.Component;

@Data
@TableName("t_product")
@Component
public class Product {
    @TableId
    private Long id;
    private String name;
}
package com.wdlm.product.dao;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.wdlm.product.pojo.Product;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface ProductMapper extends BaseMapper<Product> {
}
package com.wdlm.product.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.wdlm.product.pojo.Product;

public interface ProductService extends IService<Product> {
}
package com.wdlm.product.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.wdlm.product.dao.ProductMapper;
import com.wdlm.product.pojo.Product;
import com.wdlm.product.service.ProductService;
import org.springframework.stereotype.Service;

@Service
public class ProductServiceImpl extends ServiceImpl<ProductMapper, Product> implements ProductService {
}
package com.wdlm.product.controller;

import com.wdlm.product.feign.StockFeign;
import com.wdlm.product.pojo.Product;
import com.wdlm.product.service.ProductService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@RequestMapping("/product")
public class ProductController {
    @Autowired
    private ProductService productService;

    @RequestMapping("/list")
    public List<Product> getProductList(){
        return productService.list();
    }
}

stock

package com.wdlm.stock.pojo;

import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import org.springframework.stereotype.Component;

@TableName("t_stock")
@Component
@Data
public class Stock {
    @TableId
    private Long id;
    private Integer stock;
    private Long pid;
}
package com.wdlm.stock.dao;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.wdlm.stock.pojo.Stock;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface StockMapper extends BaseMapper<Stock> {
}
package com.wdlm.stock.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.wdlm.stock.pojo.Stock;

public interface StockService extends IService<Stock> {
}
package com.wdlm.stock.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.wdlm.stock.dao.StockMapper;
import com.wdlm.stock.pojo.Stock;
import com.wdlm.stock.service.StockService;
import org.springframework.stereotype.Service;

@Service
public class StockServiceImpl extends ServiceImpl<StockMapper, Stock> implements StockService {
}
package com.wdlm.stock.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.wdlm.stock.pojo.Stock;
import com.wdlm.stock.service.StockService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@RequestMapping("/stock")
@EnableDiscoveryClient
public class StockController {
    @Autowired
    private StockService stockService;

    @RequestMapping("/list")
    public List<Stock> getStockList() {
        return stockService.list();
    }
}

对应的数据库脚本如下:

create database mall;

create table t_product
(
    id   bigint auto_increment
        primary key,
    name varchar(20) not null
);

INSERT INTO mall_db.t_product (id, name) VALUES (1, 'iphone');
INSERT INTO mall_db.t_product (id, name) VALUES (2, 'ipad');
INSERT INTO mall_db.t_product (id, name) VALUES (3, 'mac');

create table t_stock
(
    id    bigint auto_increment
        primary key,
    stock int    not null,
    pid   bigint not null,
    constraint t_stock_ibfk_1
        foreign key (pid) references t_product (id)
);

INSERT INTO mall_db.t_stock (id, stock, pid) VALUES (1, 100, 1);
INSERT INTO mall_db.t_stock (id, stock, pid) VALUES (2, 200, 1);
INSERT INTO mall_db.t_stock (id, stock, pid) VALUES (3, 300, 1);
INSERT INTO mall_db.t_stock (id, stock, pid) VALUES (4, 500, 2);
INSERT INTO mall_db.t_stock (id, stock, pid) VALUES (5, 200, 2);
INSERT INTO mall_db.t_stock (id, stock, pid) VALUES (6, 450, 3);
INSERT INTO mall_db.t_stock (id, stock, pid) VALUES (7, 150, 3);

nacos作为注册中心用法

点击nacos进行下载,解压

mac 使用如下命令启动nacos

cd ./nacos/bin
sh startup.sh -m standalone

浏览器输入

localhost:8848/nacos

进行登录,用户名 nacos,密码 nacos

出现如下界面说明启动成功
在这里插入图片描述

将微服务注册到nacos中

添加依赖
<dependency>
     <groupId>com.alibaba.cloud</groupId>
     <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>
在product和stock项目resouces目录下,新建bootstrap.yml,分别添加如下内容
server:
  port: 8000

spring:
  application:
    name: product

  cloud:
    nacos:
      server-addr: localhost:8848
server:
  port: 9000

spring:
  application:
    name: stock

  cloud:
    nacos:
      server-addr: localhost:8848
分别在两个微服务的启动类上添加@EnableDiscoveryClient注解
启动product和stock,打开浏览器,在nacos服务管理,服务列表中,可以看到,product和stock已经完成服务注册。

在这里插入图片描述

openfeign完成服务调用

在服务注册的基础之上,可以完成服务调用
demo中,将product作为调用方,stock作为被调用方,用于查询商品对应库存,首先,在StockController中添加一个方法
@RequestMapping(value = "/listByPid/{pid}")
public Integer getStockListByPid(@PathVariable("pid") Long pid) {
    QueryWrapper<Stock> queryWrapper = new QueryWrapper();
    queryWrapper.eq("pid", pid);
    List<Stock> stockList = stockService.list(queryWrapper);
    int count = 0;
    for (Stock stock:stockList) {
        count += stock.getStock();
    }
    return count;
}

在调用方的pom文件中添加依赖

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

在调用方工程下新建包,专门用于存放服务调用api

在这里插入图片描述

定义服务调用接口

@FeignClient("stock")
public interface StockFeign {
    @RequestMapping(value = "stock/listByPid/{pid}")
    Integer getStockListByPid(@PathVariable("pid") Long pid);
}

接口口中的方法与被调用方的方法名称参数相同,url也相同,接口上标注@FeignClient注解,并指明调用的微服务名称

在调用方的启动类上标注@EnableFeignClients注解,并指明服务调用api所在的包

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients(basePackages = "com.wdlm.product.feign")
public class ProductApplication {
    public static void main(String[] args) {
        SpringApplication.run(ProductApplication.class,args);
    }
}

测试服务调用是否成功

在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
NacosOpenFeign、Gateway和Sentinel都是微服务架构中常用的开源工具。 Nacos(Naming and Configuration Service)是一个动态服务发现、配置管理和服务治理平台。它提供了服务注册和发现、配置管理和动态路由等功能,使得微服务架构中的各个服务能够自动注册并通过服务名进行发现。通过Nacos,我们可以方便地进行服务的注册与发现,以及实时更新配置信息。 OpenFeign是一个基于Java的声明式服务调用客户端。它内置了Ribbon和Hystrix,可以自动处理服务的负载均衡和容错。通过使用注解和接口代理,OpenFeign可以简化服务间的调用,在代码中只需要定义接口和方法的声明,而无需手动实现具体的服务调用逻辑。 Gateway是一个高性能的API网关,用于将外部客户端的请求路由到后端的不同服务。通过配置路由规则和过滤器链,Gateway可以完成请求的转发并进行相应的处理。它具有动态路由、请求限流、熔断降级、安全认证等功能,可以提高系统的可靠性和稳定性。 Sentinel是一个流量控制和流量治理框架,用于实现对微服务架构中各个服务的流量控制和实时监控。它提供了实时的监控、熔断降级、系统保护和流量统计等功能,并且具备高度可扩展性。通过使用Sentinel,我们可以对服务的流量进行实时监控和管理,保证系统的稳定性和可靠性。 综上所述,Nacos提供了服务发现和配置管理,OpenFeign简化了微服务间的调用,Gateway实现了高性能的API网关,Sentinel用于流量控制和治理。这些工具的结合使用可以帮助我们构建可靠、稳定的微服务架构,并提升系统的性能和可扩展性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

今天不coding

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值