环境搭建
我们需要创建一个普通的maven项目就行,因为后面我们的服务将会以模块在里面创建。同时我们将src目录删除,因为我们不会用到这个目录。
然后就是导入SpringCloud的依赖,同时要导入SpringBoot的依赖,我们之前说过,二者是有依赖关系的。要注意的SpringCloud的版本号所兼容的SpringBoot,这里可以去官网查询。这是目前比较新的

官网查询地址:https://spring.io/projects/spring-cloud#learn
然后就是一个正常SpringBoot的项目所需要的依赖,数据库,启动器,日志一些之类。下面给份参考
<?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.lin</groupId>
<artifactId>springcloud</artifactId>
<version>1.0-SNAPSHOT</version>
<modules>
<module>api</module>
</modules>
<!--打包方式 pom-->
<packaging>pom</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencyManagement>
<dependencies>
<!--spring cloud的依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--SpringBoot的依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.1.4.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--数据库-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
<!--SpringBoot 启动器-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<!--junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.18</version>
</dependency>
<!--logback-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
<!--log4j-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
服务提供者
我们在主项目下,创建一个api的模块,主要放我们的实体类。

同样是普通的maven项目就行,然后我们再次引入需要的lombok的依赖,可以发现依赖是指向我们的父maven项目。这样我们在父项目就可以很好的管理每个子模块的依赖。

我们在该模块下创建一个实体类,并在数据库下创建该表,往数据库里面插入数据。
我们的实体类需要实现序列化,不然传输的时候会报错
package com.lin.springcloud.pojo;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.io.Serializable;
@Data
@NoArgsConstructor
@Accessors(chain = true) //链式写法,例:new user().get().set() 可以链式使用的方法
public class User implements Serializable {
private int id;
private String name;
//数据存在哪一个数据库,因为微服务下,我们很可能存在很多的数据库,一个消息可能存在不同数据库
private String db_source;
private User(String name){
this.name = name;
}
}
然后就是创建我们的数据库(按照我们的实体类创建表,实际上开发我们就是先表再实体类,嘿嘿),这里就不多演示,我们展示一下插入的数据。

这里我们的数据已经有了,我们接下来就是创建服务提供者的模块,比如数据接口之类。
我们创建一个provider,标记端口为8001。因为服务多都需要端口,所以我们后面设置的时候要配置不同的端口。同时对该模块引入相关依赖
<?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">
<parent>
<artifactId>springcloud</artifactId>
<groupId>com.lin</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>provider</artifactId>
<dependencies>
<!--我们需要实体类,所以配置api-->
<dependency>
<groupId>com.lin</groupId>
<artifactId>api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<!--web依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--服务器,这里我们使用jetty-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
</dependencies>
</project>
然后我们在该模块下的resources下创建一个application.yml文件,就是我们的SpringBoot的配置文件,然后我们配置端口和数据源之类的配置
server:
port: 8001
#mybatis配置
mybatis:
type-aliases-package: com.lin.springcloud.pojo
mapper-locations: classpath:mybatis/mapper/*.xml
#spring的配置
spring:
application:
name: springcloud-provider
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/db_springcloud?useUnicode=true&characterEncoding=utf-8
username: rootlin
password: 123456
账号密码之类填写自己的数据库即可。配置完就是我们的mybatis增删改查一套了,接口,service实现一套。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.lin.springcloud.mapper.UserMapper">
<select id="queryUserById" resultType="User">
select * from user where id = #{id}
</select>
<select id="queryListUser" resultType="User">
select * from user
</select>
<insert id="addUser" parameterType="User">
insert into user (name,db_source)
values (#{name},DATABASE())
</insert>
</mapper>
package com.lin.springcloud.mapper;
import com.lin.springcloud.pojo.User;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
import java.util.List;
@Mapper
@Repository
public interface UserMapper {
User queryUserById(int id);
List<User> queryListUser();
boolean addUser(User user);
}
package com.lin.springcloud.service;
import com.lin.springcloud.pojo.User;
import org.springframework.stereotype.Service;
import java.util.List;
public interface UserService {
User queryUserById(int id);
List<User> queryListUser();
boolean addUser(User user);
}
package com.lin.springcloud.service;
import com.lin.springcloud.mapper.UserMapper;
import com.lin.springcloud.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserServiceImpl implements UserSercice{
@Autowired
private UserMapper userMapper;
@Override
public User queryUsreById(int id) {
return userMapper.queryUsreById(id);
}
@Override
public List<User> queryListUser() {
return userMapper.queryListUser();
}
@Override
public boolean addUser(User user) {
return userMapper.addUser(user);
}
}
然后就是Controller层了,也就是我们的服务提供者,前面做了那么多的铺垫也都是为了这一步。我们以Restful风格来编写
package com.lin.springcloud.controller;
import com.lin.springcloud.pojo.User;
import com.lin.springcloud.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
public class UserController {
@Autowired
UserService userService;
@PostMapping("/user/add")
public boolean addUser(User user){
return userService.addUser(user);
}
@GetMapping("/user/get/{id}")
public User queryUserById(@PathVariable int id){
return userService.queryUserById(id);
}
@GetMapping("/user/list")
public List<User> queryListUser(){
return userService.queryListUser();
}
}
然后我们写一个springboot的主启动类,因为我们这样创建的项目是没有的,在同级目录下,创建UserProvider_8001.java
的主启动类。
package com.lin.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
//启动类注解
@SpringBootApplication
public class UserProvider_8001 {
public static void main(String[] args) {
SpringApplication.run(UserProvider_8001.class,args);
}
}
我们启动测试一下,看看是否能够成功使用这些接口。


接口是可以用的,addUser因为我们是post请求,所以无法通过地址栏来添加用户。但是在下面我们消费者是可以有办法实现的。
服务消费者
我们创建一个consumer模块,在模块导入依赖,只需要web和实体类的依赖就行
<?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">
<parent>
<artifactId>springcloud</artifactId>
<groupId>com.lin</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>consumer</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.lin</groupId>
<artifactId>api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
然后创建我们的application.yml,设置一个端口就行
server:
port: 80
创建我们的启动类
package com.lin.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Consumer_80 {
public static void main(String[] args) {
SpringApplication.run(Consumer_80.class,args);
}
}
然后直接就是我们的Controller层,这里我们的通信就需要用到RestTemplate。这类似我们用到的其他模板文件,需要注册到spirng中,然后就可供我们调用
package com.lin.springcloud.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class ConfigBean {
@Bean
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
Controller层
package com.lin.springcloud.controller;
import com.lin.springcloud.pojo.User;
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 org.springframework.web.client.RestTemplate;
import java.util.List;
@RestController
public class UserControllerConsumer {
//提供了很多远程http的远程方法
@Autowired
private RestTemplate restTemplate;
//我们服务提供者的地址栏前缀
private static final String REST_URL_Provider = "http://localhost:8001";
@RequestMapping("/consumer/user/get/{id}")
public User get(@PathVariable int id){
return restTemplate.getForObject(REST_URL_Provider+"/user/get/"+id,User.class);
}
@RequestMapping("/consumer/user/list")
public List<User> queryList(){
return restTemplate.getForObject(REST_URL_Provider+"/user/list",List.class);
}
@RequestMapping("/consumer/user/add")
public boolean addUser(User user){
return restTemplate.postForObject(REST_URL_Provider+"/user/add",user,Boolean.class);
}
}
服务测试
我们先启动提供者的服务器,然后再启动消费者的服务器。通过地址栏的来进行数据查询和增加演示



我们添加了一个用户名为user6的用户也成功了,我们远程是用post的请求,但是我们在消费的时候是用get来访问,然后调用远程的post,这样就成功通过地址栏来添加用户了。这不是重点,但是也要了解。
可以看到,我们拆分服务,将原本的一站式变成了三个微服务模块来使用,对SpringCloud和微服务的概念学习可以有进一步的认识和了解。
给上项目目录结构,方便小伙伴实践

本文实践参考自狂神说学习视频
网友评论