创建两个微服务
用于服务注册、配置和调用demo,目录如下:![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/8f2d6011c8815677f9b02421f09db72c.png)
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);
}
}