kafka 怎么样连接图形化界面_从零开始搭建Kafka+SpringBoot分布式消息系统

前言

由于kafka强依赖于zookeeper,所以需先搭建好zookeeper集群。由于zookeeper是由java编写的,需运行在jvm上,所以首先应具备java环境。
(ps:默认您的centos系统可联网,本教程就不教配置ip什么的了)
(ps2:没有wget的先装一下:yum install wget)
(ps3:人啊,就是要条理。东边放一点,西边放一点,过段时间就不知道自己装在哪里了。本教程所有下载均放在/usr/local目录下)
(ps4:kafka可能有内置zookeeper,感觉可以越过zookeeper教程,但是这里也配置出来了。我没试过)

一、配置jdk

因为oracle 公司不允许直接通过wget 下载官网上的jdk包。所以你直接wget以下地址下载下来的是一个只有5k的网页文件而已,并不是需要的jdk包。(垄断地位就是任性)。
(请通过java -version判断是否自带jdk,我的没带)

1、官网下载

下面是jdk8的官方下载地址:

https://www.oracle.com/technetwork/java/javase/downloads/java-archive-javase8u211-later-5573849.html

e05358ef5ea445cc10a29aea0937d7f6.png

2、上传解压

这里通过xftp上传到服务器指定位置:/usr/local

5f2ab9c8d0c47d4643e562cf2732b8e7.png

对压缩文件进行解压:

tar -zxvf jdk-8u221-linux-x64.tar.gz

对解压后的文件夹进行改名:

mv jdk1.8.0_221 jdk1.8

3、配置环境变量

vim /etc/profile
#java environment
export JAVA_HOME=/usr/local/jdk1.8
export CLASSPATH=.:${JAVA_HOME}/jre/lib/rt.jar:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar
export PATH=$PATH:${JAVA_HOME}/bin

操作之后的界面如下:

4d3c82d79dac99fc9025a525f4a2e521.png

运行命令使环境生效

source /etc/profile

755a6ec40eee9b8962b175d2984b9cb4.png

二、搭建zookeeper集群

1、下载zookeeper

创建zookeeper目录,在该目录下进行下载:

mkdir /usr/local/zookeeper

这一步如果出现连接被拒绝时可多试几次,我就是第二次请求才成功的。

wget http://archive.apache.org/dist/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz

39c4f8093c774b20e0bb462ee36aee80.png

等待下载完成之后解压:

tar -zxvf zookeeper-3.4.6.tar.gz

2f066e0be33328179b73b2939c28b712.png

重命名为zookeeper1

mv zookeeper-3.4.6 zookeeper1
cp -r zookeeper1 zookeeper2
cp -r zookeeper1 zookeeper3

2、创建data、logs文件夹

在zookeeper1目录下创建

7c03fe099648a2252c39b0986e85381e.png

在data目录下新建myid文件。内容为1

723d8afa11f5ef6fa95904a566c159e9.png

0ddcb204dd179275fd0543e4693bf718.png

3、修改zoo.cfg文件

cd /usr/local/zookeeper/zookeeper1/conf/
cp zoo_sample.cfg zoo.cfg

进行过上面两步之后,有zoo.cfg文件了,现在修改内容为:

9e898a8eb978ca14b09d2fa9a26d0c46.png

dataDir=/usr/local/zookeeper/zookeeper1/data
dataLogDir=/usr/local/zookeeper/zookeeper1/logs
server.1=192.168.233.11:2888:3888
server.2=192.168.233.11:2889:3889
server.3=192.168.233.11:2890:3890

4、搭建zookeeper2

首先,复制改名。

cd /usr/local/zookeeper/
cp -r zookeeper1 zookeeper2

然后修改具体的某些配置:

vim zookeeper2/conf/zoo.cfg

将下图三个地方1改成2

06797c1cfdb821b40e55b9d3e85643a4.png

vim zookeeper2/data/myid

同时将myid中的值改成2

ec6b4cc9f152346fc5a1e296e9f985db.png

5、搭建zookeeper3

同上,复制改名

cp -r zookeeper1 zookeeper3

dd077cbd29e241afd018d4975c93d452.png

vim zookeeper3/conf/zoo.cfg

修改为3

74580411386835eb1add840b5585558c.png

vim zookeeper3/data/myid

修改为3

6ca6da1c66b9e789c1f561b0df725968.png

6、测试zookeeper集群

cd /usr/local/zookeeper/zookeeper1/bin/

由于启动所需代码比较多,这里简单写了一个启动脚本:

vim start

start的内容如下

cd /usr/local/zookeeper/zookeeper1/bin/
./zkServer.sh start ../conf/zoo.cfg
cd /usr/local/zookeeper/zookeeper2/bin/
./zkServer.sh start ../conf/zoo.cfg
cd /usr/local/zookeeper/zookeeper3/bin/
./zkServer.sh start ../conf/zoo.cfg

下面是连接脚本:

vim login

login内容如下:

./zkCli.sh -server 192.168.233.11:2181,192.168.233.11:2182,192.168.233.11:2183

脚本编写完成,接下来启动:

sh start
sh login

启动集群成功,如下图:

27a8523b37ac927e9f1d5cad8b946934.png


这里zookeeper就告一段落了,由于zookeeper占用着输入窗口,这里可以在xshell右键标签,新建ssh渠道。然后就可以在新窗口继续操作kafka了!

65409d464c5c3554fe07cf0a08b5a208.png

三、搭建kafka集群

1、下载kafka

首先创建kafka目录:

mkdir /usr/local/kafka

然后在该目录下载

cd /usr/local/kafka/
wget https://archive.apache.org/dist/kafka/1.1.0/kafka_2.11-1.1.0.tgz

下载成功之后解压:

tar -zxvf kafka_2.11-1.1.0.tgz

2、修改集群配置

首先进入conf目录下:

cd /usr/local/kafka/kafka_2.11-1.1.0/config

修改server.properties
修改内容:

broker.id=0
log.dirs=/tmp/kafka-logs
listeners=PLAINTEXT://192.168.233.11:9092

复制两份server.properties

cp server.properties server2.properties
cp server.properties server3.properties

修改server2.properties

vim server2.properties

修改主要内容为:

broker.id=1
log.dirs=/tmp/kafka-logs1
listeners=PLAINTEXT://192.168.233.11:9093

如上,修改server3.properties
修改内容为:

broker.id=2
log.dirs=/tmp/kafka-logs2
listeners=PLAINTEXT://192.168.233.11:9094

3、启动kafka

这里还是在bin目录编写一个脚本:

cd ../bin/
vim start

脚本内容为:

./kafka-server-start.sh ../config/server.properties &
./kafka-server-start.sh ../config/server2.properties &
./kafka-server-start.sh ../config/server3.properties &

通过jps命令可以查看到,共启动了3个kafka。

037bf831385c89815b504c175cc35997.png

4、创建Topic

cd /usr/local/kafka/kafka_2.11-1.1.0
bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 3 --partitions 1 --topic my-replicated-topic

518d588f4ff52cc5175ac5ae85fc6a5c.png

kafka打印了几条日志

cf069ad45070eccbe58148cef64d6db1.png


在启动的zookeeper中可以通过命令查询到这条topic!

ls /brokers/topics

68b0aa2b74cd5d199a5ac8994e214774.png

查看kafka状态

bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic my-replicated-topic

e93201e53daf78727650bcdca301056c.png

可以看到此时有三个节点 1 , 2 , 0

Leader 是1 ,
因为分区只有一个 所以在0上面,
Replicas:主从备份是 1,2,0,
ISR(in-sync):现在存活的信息也是 1,2,0

5、启动生产者

bin/kafka-console-producer.sh --broker-list localhost:9092 --topic my-replicated-topic

由于不能按删除,不能按左右键去调整,所以语句有些乱啊。em…

e27f09272fe91647d051d583fc8bb1c6.png

6、启动消费者

bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --from-beginning --topic my-replicated-topic

可以看出,启动消费者之后就会自动消费。

05391ba330220e0d78d45fc8f5d2ecdb.png

在生产者又造了一条。

0bdebff1928f3d1e2041be80a793fe4f.png

消费者自动捕获成功!

6b5420a2d9c55015630114bc670448c1.png

四、集成springboot

先贴一张kafka兼容性目录:

e4a1aa2f9ace326f84d4d5630ed0e6f0.png

不满足的话启动springboot的时候会抛异常的!!!ps:该走的岔路我都走了o(╥﹏╥)o
(我的kafka-clients是1.1.0,spring-kafka是2.2.2,中间那列暂时不用管)

c235f650469e45474fa6d6c484c8a61b.png

回归正题,搞了两个小时,终于搞好了,想哭…
遇到的问题基本就是jar版本不匹配。
上面的步骤我也都会相应的去修改,争取大家按照本教程一遍过!!!

1、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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0modelVersion>
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.1.1.RELEASEversion>
<relativePath/>
parent>
<groupId>com.gzkygroupId>
<artifactId>studyartifactId>
<version>0.0.1-SNAPSHOTversion>
<name>studyname>
<description>Demo project for Spring Bootdescription>

<properties>
<java.version>1.8java.version>
properties>

<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>

<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
<exclusions>
<exclusion>
<groupId>org.junit.vintagegroupId>
<artifactId>junit-vintage-engineartifactId>
exclusion>
exclusions>
dependency>

<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-redisartifactId>
<version>1.3.8.RELEASEversion>
dependency>

<dependency>
<groupId>redis.clientsgroupId>
<artifactId>jedisartifactId>
dependency>


<dependency>
<groupId>org.springframework.kafkagroupId>
<artifactId>spring-kafkaartifactId>
<version>2.2.0.RELEASEversion>
dependency>

<dependency>
<groupId>org.apache.kafkagroupId>
<artifactId>kafka-clientsartifactId>
dependency>

dependencies>

<build>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
plugin>
plugins>
build>

project>

pom文件中,重点是下面这两个版本。

<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.1.1.RELEASEversion>
<relativePath/>
parent>
<dependency>
<groupId>org.springframework.kafkagroupId>
<artifactId>spring-kafkaartifactId>
<version>2.2.0.RELEASEversion>
dependency>

2、application.yml

spring:
redis:
cluster:
#设置key的生存时间,当key过期时,它会被自动删除;
expire-seconds: 120
#设置命令的执行时间,如果超过这个时间,则报错;
command-timeout: 5000
#设置redis集群的节点信息,其中namenode为域名解析,通过解析域名来获取相应的地址;
nodes: 192.168.233.11:9001,192.168.233.11:9002,192.168.233.11:9003,192.168.233.11:9004,192.168.233.11:9005,192.168.233.11:9006
kafka:
# 指定kafka 代理地址,可以多个
bootstrap-servers: 192.168.233.11:9092,192.168.233.11:9093,192.168.233.11:9094
producer:
retries: 0
# 每次批量发送消息的数量
batch-size: 16384
buffer-memory: 33554432
# 指定消息key和消息体的编解码方式
key-serializer: org.apache.kafka.common.serialization.StringSerializer
value-serializer: org.apache.kafka.common.serialization.StringSerializer
consumer:
# 指定默认消费者group id
group-id: test-group
auto-offset-reset: earliest
enable-auto-commit: true
auto-commit-interval: 100
# 指定消息key和消息体的编解码方式
key-serializer: org.apache.kafka.common.serialization.StringSerializer
value-serializer: org.apache.kafka.common.serialization.StringSerializer

server:
port: 8085
servlet:
#context-path: /redis
context-path: /kafka

没有配置Redis的可以把Redis部分删掉,也就是下图:
想学习配置Redis集群的可以参考:《Redis集群redis-cluster的搭建及集成springboot》

abd3ba70ede2e98a0c2c5411d9d0764d.png

3、生产者

package com.gzky.study.utils;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.stereotype.Component;

/**
* kafka生产者工具类
*
* @author biws
* @date 2019/12/17
**/
@Component
public class KfkaProducer {

private static Logger logger = LoggerFactory.getLogger(KfkaProducer.class);

@Autowired
private KafkaTemplate kafkaTemplate;/**
* 生产数据
* @param str 具体数据
*/public void send(String str) {
logger.info("生产数据:" + str);
kafkaTemplate.send("testTopic", str);
}
}

4、消费者

package com.gzky.study.utils;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Component;

/**
* kafka消费者监听消息
*
* @author biws
* @date 2019/12/17
**/
@Component
public class KafkaConsumerListener {

private static Logger logger = LoggerFactory.getLogger(KafkaConsumerListener.class);

@KafkaListener(topics = "testTopic")
public void onMessage(String str){
//insert(str);//这里为插入数据库代码
logger.info("监听到:" + str);
System.out.println("监听到:" + str);
}

}

5、对外接口

package com.gzky.study.controller;

import com.gzky.study.utils.KfkaProducer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
* kafka对外接口
*
* @author biws
* @date 2019/12/17
**/
@RestController
public class KafkaController {

@Autowired
KfkaProducer kfkaProducer;

/**
* 生产消息
* @param str
* @return
*/
@RequestMapping(value = "/sendKafkaWithTestTopic",method = RequestMethod.GET)
@ResponseBody
public boolean sendTopic(@RequestParam String str){
kfkaProducer.send(str);
return true;
}
}

6、postman测试

这里首先应该在服务器启动监听器(kafka根目录),下面命令必须是具体的服务器ip,不能是localhost,是我踩过的坑:

推荐此处重启一下集群
关闭kafka命令:

cd /usr/local/kafka/kafka_2.11-1.1.0/bin
./kafka-server-stop.sh ../config/server.properties &
./kafka-server-stop.sh ../config/server2.properties &
./kafka-server-stop.sh ../config/server3.properties &

此处应该jps看一下,等待所有的kafka都关闭(关不掉的kill掉),再重新启动kafka:

./kafka-server-start.sh ../config/server.properties &
./kafka-server-start.sh ../config/server2.properties &
./kafka-server-start.sh ../config/server3.properties &

等待kafka启动成功后,启动消费者监听端口:

cd /usr/local/kafka/kafka_2.11-1.1.0
bin/kafka-console-consumer.sh --bootstrap-server 192.168.233.11:9092 --from-beginning --topic testTopic

b418772e4e968ba2460071fbda971a80.png

曾经我乱输的测试信息全部被监听过来了!

启动springboot服务

d88e3f9aa90f8335a84bb4736afc1b74.png

然后用postman生产消息:

34d325c4308042d7c4a0197b1010c6ed.png

然后享受成果,服务器端监听成功。

17b8bc59758e274509a3bf0a25f6914b.png

项目中也监听成功!

4bcd2612a8bd5ed3d70c6dc789010f70.png

点个在看 你最好看

2748ec97101e758137325487fb334d62.png往期推荐

腾讯强推Redis成长手册!原理+应用+集群+拓展+源码五飞

阿里要求其程序员必须精通的并发编程笔记:原理+模式+应用

支付宝阿牛整合Netty+Redis+ZK「终极」高并发手册

饿了么架构师发布“绝版”Java并发实现原理:JDK源码剖析

不吹不擂,10年架构师公开分享SQL工作笔记,5字真言总结到位

由浅入深吃透容器云+微服务+K8S+MQ+阿里云内部实施手册

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/571634.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《Iterative-GAN》的算法伪代码整理

花了一下午时间整理本人的论文Iterative-GAN的算法伪代码&#xff0c;由于篇幅较长&#xff0c;投会议方面的文章就不加入了&#xff0c;以后如果投期刊再说。留此存档。 转载于:https://www.cnblogs.com/punkcure/p/7821031.html

h5能调取摄像头吗_高质感的国产中型车,实力能比肩本田雅阁吗?带你看红旗H5...

中国品牌的豪华中型车&#xff0c;带你看红旗H5伴随着经济的快速发展&#xff0c;大家的钱包现在也是越来越鼓&#xff0c;也开始向往更加美好的生活。曾经很多人买车都是为了满足基本的代步需求&#xff0c;如今也开始在车辆的品质与行驶质感上有了更高要求。而为了迎合市场变…

lstm网络_LSTM(长短期记忆网络)

在上篇文章一文看尽RNN(循环神经网络)中&#xff0c;我们对RNN模型做了总结。由于RNN也有梯度消失的问题&#xff0c;因此很难处理长序列的数据&#xff0c;大牛们对RNN做了改进&#xff0c;得到了RNN的特例LSTM(Long Short-Term Memory)&#xff0c;它可以避免常规RNN的梯度消…

ant接口用什么天线_手机听收音机时,为什么必须用耳机作为天线?

名侦探柯基-十万个为什么 第七十六期起因&#xff0c;观看活着韩国丧尸电影时的一幕&#xff0c;刘亚仁想听电台广播&#xff0c;却无奈于所有设备都是无线的&#xff0c;由此疑惑到&#xff0c;只有插入有线的耳机&#xff0c;才能收听广播吗&#xff1f;耳机线就是天线&#…

qt c++ 图片预览_Qt多语言国际化

Qt附加工具介绍Qt Assistant&#xff08;Qt助手)Qt Linguist&#xff08;Qt语言家&#xff09;Qt Designer&#xff08;Qt设计师&#xff09;Qt AssistantQt Assistant是可配置且可重新发布的文档阅读器&#xff0c;可以方便地进行定制并与Qt应用程序一起重新发布。Qt Assistan…

Icon+启动图尺寸

1、LaunchImage 启动图 命名格式&#xff1a; 1x -> xxx.png 2x -> xxx2x.png Retina 4 -> xxx2x.png     转载于:https://www.cnblogs.com/z-z-z/p/7828082.html

智商情商哪个重要_《所谓逆商高,就是心态好》:逆商,比情商和智商更重要...

所谓“逆商”&#xff0c;是指人们遇到逆境时的应对能力&#xff0c;即战胜挫折、摆脱困境和超越困难的能力。我们一生会面临各种各样的难题&#xff0c;也许是考试失利&#xff0c;也许是和心爱的人分离&#xff0c;也许是工作上竞争失败……在失意的时候你会做何选择&#xf…

mysql 排名_学会在MySQL中实现Rank高级排名函数,所有取前几名问题全部解决.

MySQL中没有Rank排名函数&#xff0c;当我们需要查询排名时&#xff0c;只能使用MySQL数据库中的基本查询语句来查询普通排名。尽管如此&#xff0c;可不要小瞧基础而简单的查询语句&#xff0c;我们可以利用其来达到Rank函数一样的高级排名效果。在这里我用一个简单例子来实现…

意大利_【解读】去意大利留学,一定要学意大利语吗?意大利语难吗?

喜欢意大利&#xff0c;想去意大利留学&#xff0c;但不想学意大利语可以吗&#xff1f;意大利语太难了&#xff0c;听说有英授专业(本来就要学英语、考雅思所以不担心英语)……问题来了去意大利留学&#xff0c;选择英授专业的话还需要学意大利语吗&#xff1f;我们一点点剖析…

MD5、SHA1、SHA256的简单讲解

简述: 最近在研究系统以及驱动&#xff0c;当下载比较大的文件时总会提供SHA1或者SHA256&#xff0c;下载结束后使用校验工具得到的值与它进行比对来判断下载是否成功。 使用工具校验 certutil -hashfile 文件名 sha1/sha256/md5正文: MD5、SHA1、SHA256这些都被称为 哈希…

java swarm集群_52个Java程序员不可或缺的 Docker 工具

Docker工具分类列表编排和调度持续集成/持续部署(CI / CD)监控记录安全存储/卷管理联网服务发现构建管理编排和调度 1. KubernetesKubernetes是市场上最实用的最受欢迎的容器编排引擎。最初作为一个Google项目开始&#xff0c;成千上万的团队使用它来部署生产中的容器。谷歌声称…

comsol显示电场计算结果_在 COMSOL 中构建磁流体动力学多物理场模型

COMSOL Multiphysics 软件中的模型都是从零开始构建的&#xff0c;软件支持多物理场&#xff0c;因此用户可以按照自己的意愿轻松地组合代表不同物理场现象的模型。有时这可以通过使用软件的内置功能来实现&#xff0c;但有些情况下&#xff0c;用户需要做一些额外的工作。我们…

RGB转LAB色彩空间

https://www.cnblogs.com/hrlnw/p/4126017.html 1.原理 RGB无法直接转换成LAB&#xff0c;需要先转换成XYZ再转换成LAB&#xff0c;即&#xff1a;RGB——XYZ——LAB 因此转换公式分两部分&#xff1a; &#xff08;1&#xff09;RGB转XYZ 假设r,g,b为像素三个通道&#xff0c;…

React- jsx的使用可以渲染html标签 或React组件

React 的 JSX 使用大、小写的约定来区分本地组件的类和 HTML 标签。既渲染html标签需要使用小写字母开头的标签名而渲染本地React组件需要使用大写字母开头的标签名 注意: 由于 JSX 就是 JavaScript&#xff0c;一些标识符像 class 和 for 不建议作为 XML 属性名。作为替代&…

bigdecimal保留4位小数_四年级数学小数的加减乘法知识点汇总,带练习!

张老师 - 4年级(多品小学教育)顺城中心小学郭老师和环县虎洞中心小学谭老师需要的这份学习资料现在分享。本资料已制作电子版下载码是&#xff1a;76qa32vd《小数的加减乘法》知识点一、小数加、减法的计算法则(1)小数点要对齐&#xff0c;也就是相同数位要对齐&#xff1b;相同…

vs未指定启动文件_高效开发利器之自定义模板文件

简介越来越多的设计模式, 最佳实践, 优化了软件开发方式, 提高了软件质量, 但是也带来了大量的类似的文件. 比如说: 现在都使用三层模式来开发Web程序, 都会有服务层(Service), DI的流行, 每个服务类都会自动注入一些固定的对象, 日志对象, 缓存对象等等. 实体类(Entity)到DTO对…

react-router 4.0 学习笔记

1、安装react-router-dom 2、页面上要使用的时候要引入  import {BrowserRouter as Router,Route,Link } from react-router-dom 3、使用的时候要在外层包一个<Router> 4、param 在路径上如果带有/:id类似这种的&#xff0c;要取值的时候&#xff0c;match.params.id取…

分数优先遵循志愿php源码_2021年南昌中考志愿填报指导,这七大要点你都了解吗?...

中考是孩子即将面对人生的第一个十字路口&#xff0c;家长们也因此开始为孩子的未来紧张。都说选择大于努力&#xff0c;给孩子选一个适合的学校也很重要&#xff0c;为了大家可以更好的填报志愿&#xff0c;小编为大家汇总了这份指南&#xff0c;快来一起看看吧~1、认清自己&a…

gin ip 和 本地访问的结果不一样_golang web开发——gin实战之整合swagger

背景如果我们之前搞过java web开发&#xff0c;我们应该都知道swagger这个API文档自动生成利器&#xff0c;有了swagger可以方便我们与客户端的联调&#xff0c;基本上是一目了然&#xff0c;swagger支持java&#xff0c;自然它也能支持golang的gin框架&#xff0c;本小节&…

cif是目的港交货吗_刚接手出口业务,搞不懂FOB? CIF? 为你科普→

Export专用名词辨析01 名词辨析#FOBFOB(Free On Board)&#xff0c;含义是装运港船上交货&#xff0c;指卖方在合同规定的装运港负责将货物装上买方指定的船上&#xff0c;并负责货物装船之前的一切费用和风险&#xff0c;以及办理出口通关的相关事宜及费用&#xff0c;所以在实…