詳細演示user-service的搭建過程,user-consume的搭建過程類似,只說明有區別的部分。
這兩個項目沒有構成完整的微服務demo,完整的需要去看主文章。
1. 創建工程和user-service模塊
1.1 創建空工程
1.2 在空工程里新建Module
一個Module就是一個項目,一個微服務。
選擇Spring Initializr,JDK1.8及以上,Default URL(訪問這個URL:https://start.spring.io也可以在頁面上選擇模塊構建並下載工程)
填寫Group和Artifact信息
選擇模塊
由於我們要提供接口,查詢並返回數據,所以需要Web和SQL的相應模塊。
點Next->Finish完成。
項目結構如圖所示:
- UserServiceApplication: 啟動里面的main函數就能啟動這個項目。
- resources:里面放靜態資源,static放的一般是圖片,腳本和CSS;templates是前端靜態化頁面的默認存放位置(本例不涉及頁面靜態化)。
- application.yml:SpringBoot項目的整體配置文件,可以配置包括JDBC、連接池等屬性。這個文件默認后綴名是properties,可以修改為yml,yml的語法更簡潔。
- pom.xml:這是一個maven項目,里面引入了項目所需的各種依賴。
2. 配置文件
2.1 pom.xml
除了自動生成的部分,我還添加了三個依賴
- javax.persistence-api:java持久層API,用於pojo類的@Table等注解,關聯實體類和數據庫表
- lombok: 用於pojo類的@Data注解,用於自動生成get,set方法。
- mapper-spring-boot-starter: 通用mapper,繼承通用mapper后能直接使用其包含的查詢方法查詢,不必再寫xml文件。
<?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>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.5.RELEASE</version>
<relativePath/>
</parent>
<groupId>com.vplus.demo</groupId>
<artifactId>user-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>user-service</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--*******************自己添加的依賴開始*****************-->
<dependency>
<groupId>javax.persistence</groupId>
<artifactId>javax.persistence-api</artifactId>
<version>2.2</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.8</version>
</dependency>
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>2.0.2</version>
</dependency>
<!--*******************自己添加的依賴結束*****************-->
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2.2 application.yml
- SpringBoot里面自帶tomcat,配置端口為8081即可使用
- 自帶hikariCP數據源,直接配置即可。我的mysql版本為5.7,url屬性需要加上
useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
來解決時區和亂碼問題。 - mybatis只需要指明pojo類在哪里即可。
server:
port: 8081
spring:
datasource:
url: jdbc:mysql://localhost:3306/你的數據庫名?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
username: 你的數據庫用戶名
password: 你的數據庫用戶密碼
hikari:
maximum-pool-size: 20
minimum-idle: 10
mybatis:
type-aliases-package: com.vplus.demo.userservice.pojo
3. 代碼
3.1 代碼目錄結構
3.2 UserController
@RestController注解相當於@Controller注解外加給所有方法加上@ResponseBody注解。表現為:每個方法返回的都是json字符串。
@RestController
@RequestMapping("user")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/{id}")
public User queryById(@PathVariable("id") Long id) {
return this.userService.queryById(id);
}
}
3.3 UserService
為了簡便,不再寫service接口和Impl實現了,直接合成一個Service類。
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public User queryById(Long id) {
return this.userMapper.selectByPrimaryKey(id);
}
}
3.4 UserMapper
繼承通用Mapper,由於@Mapper注解的存在,和通用Mapper重名,因此通用Mapper寫成全類名tk.mybatis.mapper.common.Mapper<User>
@Mapper
public interface UserMapper extends tk.mybatis.mapper.common.Mapper<User>{
}
3.5 啟動
啟動UserServiceApplication
的main函數,訪問http://localhost:8081/user/20即可查到ID為20的用戶。
至此user-service模塊搭建完成
4. 創建user-consume模塊
搭建流程和創建user-service模塊一致,需要注意一點:選擇依賴時只選Web模塊,不需要SQL模塊。因為數據是從user-service提供的接口里面讀的。
添加第二個模塊后,Idea會提示你是否顯示Run DashBoard,要選擇顯示。
4.1 配置文件
pom.xml
- 我們使用RestTemplate請求接口,底層Http客戶端使用Okhttp實現,所以添加其依賴。
- pojo類需要@Data注解生成get/set方法,添加lombok依賴。
省略......
</dependencies>
省略.......
<!--添加OKhttp支持-->
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>3.9.0</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
省略......
application.yml
配置項目的tomcat端口為8082
server:
port: 8082
4.2 代碼
項目結構
UserConsumeApplication
注冊RestTemplate
@SpringBootApplication
public class UserConsumeApplication {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate(new OkHttp3ClientHttpRequestFactory());
}
public static void main(String[] args) {
SpringApplication.run(UserConsumeApplication.class, args);
}
}
User
這個項目還需要User類來承載數據,但不需要關聯數據表了,所以@Table
注解就不用寫了
@Data
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private String username;
private String phone;
}
ConsumerController
@RestController
@RequestMapping("consume")
public class ConsumerController {
@Autowired
private UserService userService;
@GetMapping
public List<User> consume(@RequestParam("ids") List<Long> ids) {
return this.userService.queryUserByIds(ids);
}
}
UserService
@Service
public class UserService {
@Autowired
private UserDao userDao;
public List<User> queryUserByIds(List<Long> ids){
List<User> users = new ArrayList<>();
for (Long id : ids) {
User user = this.userDao.queryUserById(id);
users.add(user);
}
return users;
}
}
UserDao
這里的Dao並不是“真正的Dao”,不是從數據庫查詢數據,而是使用RestTemplate
訪問遠程的rest接口。
@Component
public class UserDao {
@Autowired
private RestTemplate restTemplate;
public User queryUserById(Long id){
String url = "http://localhost:8081/user/" + id;
return this.restTemplate.getForObject(url, User.class);
}
}
4.3 啟動運行
從Run DashBoard中依次啟動兩個項目。訪問:http://localhost:8082/consume?ids=20,21即可查詢id=20和21的兩個用戶的信息
5. 參考資料
- 黑馬培訓的樂優商城筆記
- spring官網