1.新建一个新的maven项目
总项目的pom文件
<groupId>com.kuang</groupId>
<artifactId>springCloud</artifactId>
<version>1.0-SNAPSHOT</version>
<modules>
<module>springCloud-api</module>
<module>springCloud-provider-dept-7001</module>
<module>springCloud-customer-80</module>
</modules>
<properties>
<junit-version>4.12</junit-version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<!--打包方式-->
<packaging>pom</packaging>
<!--管理标签-->
<dependencyManagement>
<dependencies>
<!--导入 springCloud的依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.SR3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--导入springBoot依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.1.4</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--数据库-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.25</version>
</dependency>
<!--数据源-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.11</version>
</dependency>
<!--junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit-version}</version>
<scope>test</scope>
</dependency>
<!--springboot启动器-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.2</version>
</dependency>
<!--lombok 简化实体类-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
</dependency>
<!--log4j-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.11</version>
</dependency>
</dependencies>
</dependencyManagement>
注意:不同的springCloud版本,必须和对应的springBoot
版本相对应:参考https://blog.csdn.net/qq_36050986/article/details/124983325
2.新建一个新的model项目(maven普通项目)实体类包
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<!--当前module用到的依赖,如父依赖已有,则不需要版本-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</dependency>
</dependencies>
在该项目中新建实体类
/**注意:当我们没有指定构造器时,Java 编译器会帮我们自动生成一个没有任何参数的构造器
给该类,但是如果我们自己写了构造器之后,Java 就不会自动帮我们补上那个无参数的构造器
了,然而很多地方(像是 Spring Data JPA),会需要每个类都一定要有一个无参数的构造
器,所以在加上 @AllArgsConstructor 时,一定要补上 @NoArgsConstrcutor,不然会出
现问题。*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)//链式写法,可以连续赋值
public class Dept implements Serializable { //实体类,类和表的关系映射
private long id;
private String name;
private String db_source;
//微服务,可以一个服务对应一个数据库
public Dept(String name) {
this.name = name;
}
/*
* Dept dept = new Dept();
* dept.setId().setName();
*
* */
}
3.新建一个新的maven项目,作为服务提供者
(通过引入依赖,从零开始实现一个springBoot项目)
<dependencies>
<!--需要拿到实体类,所以需要这个module-->
<dependency>
<groupId>com.kuang</groupId>
<artifactId>springCloud-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<!--test-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-test</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
<!--热部署-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
4配置文件:application.yml
server:
port: 8001
#mybatis配饰
mybatis:
type-aliases-package: com.kuang.springCloud.pojo
config-location: classpath:mybatis/mybatis-config.xml
mapper-locations: classpath:mybatis/mapper/*.xml
#spring配置
spring:
application:
name: springCloud-provier-dept
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncode=utf-8
username: root
password: 987cde@
mybatis相关内容:http://t.csdn.cn/jOmpY
5.写dao层接口和对应的mapper文件
@Mapper
@Repository
public interface deptDao {
public boolean addDept(Dept dept);
public List<Dept> getDept();
public Dept getById(long id);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--mybatis 核心配置文件-->
<mapper namespace="com.kuang.springcloud.dao.deptDao">
<insert id="addDept" parameterType="Dept">
insert into dept (name,db_source)
values (#{name},DATABASE())
</insert>
<select id="getDept" resultType="Dept">
select * from dept
</select>
<select id="getById" resultType="Dept" parameterType="long">
select * from dept where id=#{id}
</select>
</mapper>
6.写service和其实现类
@Service
public class DeptServiceImpl implements DeptService {
@Autowired
private deptDao deptdao;
@Override
public boolean addDept(Dept dept) {
return deptdao.addDept(dept);
}
@Override
public List<Dept> getDept() {
return deptdao.getDept();
}
@Override
public Dept getById(long id) {
return deptdao.getById(id);
}
}
7.写前端入口控制器
//提供Restful服务
@RestController
public class deptController {
@Autowired
private DeptService deptService;
@PostMapping ("/dept/add")
public boolean addDept(@RequestBody Dept dept){
System.out.println(dept.getName());
return deptService.addDept(dept);
}
@GetMapping ("/dept/getDept")
public List<Dept> addDept(){
return deptService.getDept();
}
@GetMapping("/dept/getById/{id}")
public Dept getDept( @PathVariable("id") Long id){
return deptService.getById(id);
}
}
8.springBoot启动类
@SpringBootApplication
public class DeptProvider {
public static void main(String[] args) {
SpringApplication.run(DeptProvider.class,args);
}
}
9启动项目后通过Restful请求获取结果
调用接口 @GetMapping(“/dept/getById/{id}”)
10.新建一个服务消费者
新的maven工程,引入需要的pom文件
<dependencies>
<dependency>
<groupId>com.kuang</groupId>
<artifactId>springCloud-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.6.7</version>
</dependency>
</dependencies>
application.yml只需要配置启动端口
server:
port: 80
tomcat:
max-http-form-post-size: 0
11.服务消费者用到一个RestTemplate类,这个是spring提供的模板,可以有需要的方法,通过resultFul风格的请求到服务提供者。
a.首先写一个配置类,提供RestTemplate的bean对象
@Configuration
public class BeanConfig {
@Bean
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
12.写控制器,用于给前端访问
@RestController
public class CustomerController {
//消费者没有service层、
// RestTemplate 注册到spring中,供我们直接使用就可以
// (url,实体 map,Class<T> responseType)
//服务提供者的访问地址,参数,返回类型
@Autowired
private RestTemplate restTemplate;//提供多种便捷访问远程服务的模板,spring提供
//调用服务提供中需要的服务地址前缀,后期会从注册中心获取
private static final String REST_URL_PREFIX = "http://localhost:8001";
@RequestMapping("/customer/getDept/{id}")
public Dept getDeptById(@PathVariable("id") Long id){
return restTemplate.getForObject(REST_URL_PREFIX+"/dept/getById/"+id,Dept.class);
}
@RequestMapping("/customer/getDepts")
public List<Dept> getDept(){
return restTemplate.getForObject(REST_URL_PREFIX+"/dept/getDept",List.class);
}
@RequestMapping("/customer/add")
public Boolean addDept(Dept dept){
System.out.println(dept.getName());
return restTemplate.postForObject(REST_URL_PREFIX+"/dept/add",dept,Boolean.class);
}
13.添加主启动类后,启动服务提供者和服务消费者,通过访问服务消费者,实现效果。
两个不同的访问路径,达到相同的返回结果,实际上都是通过服务提供者拿到的数据。