一、搭建maven父工程
父工程的好處在於統一各個項目的jar包版本,防止依賴衝突
New -> Maven -> Maven Project。
注意packaging處應選pom
pom文件內容如下:
<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.syr.springcloud</groupId>
<artifactId>microservice</artifactId>
<version>0.0.1-SNAPSHOT</version>
<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>
<junit.version>4.12</junit.version>
<log4j.version>1.2.17</log4j.version>
<lombok.version>1.16.18</lombok.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>1.5.9.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.0</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
二、建立公共子項目
創建公共項目相當於把多個子項目都需要的類放在一起打成jar包,然後每個子項目都可以導入該jar包使用裏面的公共類。
1.創建maven-modul
在microservice父工程中創建microservice-api子模塊如下:
New -> Maven -> Maven Module
創建完成之後,此時api子模塊的pom應如下:
2.新建類
在該子模塊中,我需要使用lombok依賴創建一個公共類User。所以在pom文件中添加
<dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> </dependencies>
然後創建User類如下:
package com.syr.api.entity;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@ToString
@Builder
public class User {
private int id;
private String name;
private int age;
private String datebase;
}
3.裝載
創建完公共項目後,執行mvn clean install進行裝載。
完成後父工程的pom文件裏會顯示子模塊如下:
<modules>
<module>microservice-api</module>
</modules>
三、建立服務提供者
這裏實現一個簡單的mvc設計模式並符合REST規範(只對URI進行處理返回內容並沒有處理,這裏只是作爲一個簡單的demo)的項目。
這裏另外提一句,mvc設計模式與三成架構軟件架構不是一回事,一種是設計模式一種是軟件架構,軟件架構更宏觀,它們的關係可以如下圖表示:
1.創建maven-modul
在microservice父工程中創建microservice-provider1001子模塊如下:
New -> Maven -> Maven Module
添加公共類和需要的依賴如下:
<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>com.syr.springcloud</groupId>
<artifactId>microservice</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>microservice-provider1001</artifactId>
<dependencies>
<dependency>
<groupId>com.syr.springcloud</groupId>
<artifactId>microservice-api</artifactId>
<version>${project.version}</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-jetty</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-test</artifactId>
</dependency>
<!-- 修改後立即生效,熱部署 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
</dependencies>
</project>
配置文件application.yml如下:
server:
port: 1001
mybatis:
config-location: "classpath:mybatis/mybatis.cfg.xml" # mybatis配置文件所在路徑
mapper-locations:
- "classpath:mybatis/mapper/**/*.xml" # mapper映射文件
type-aliases-package: com.syr.springcloud.entity # 別名類所在包
spring:
application:
name: microservicecloud-provider #微服務的名字
datasource:
driver-class-name: org.gjt.mm.mysql.Driver # mysql驅動包
type: com.alibaba.druid.pool.DruidDataSource # 當前數據源操作類型
url: "jdbc:mysql://localhost:3306/user01" # 數據庫名稱
username: root
password: mysql
dbcp2:
initial-size: 5 # 初始化連接數
max-total: 5 # 最大連接數
max-wait-millis: 200 # 等待連接獲取的最大超時時間
min-idle: 5
在resources中新建文件夾mybatis、在mybatis文件夾下新建mybatis.cfg.xml配置文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 開啓二級緩存 -->
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
</configuration>
在mybatis文件夾下新建mapper文件夾並新建UserMapper.xml:
<?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.syr.provider.mapper.UserMapper">
<select id="getUserById" resultType="com.syr.api.entity.User" parameterType="int">
select * from user where ID=#{id}
</select>
<select id="getUsersAll" resultType="com.syr.api.entity.User">
select * from user
</select>
<insert id="addUser" parameterType="com.syr.api.entity.User">
INSERT INTO `user`(`name`,`age`,`database`) VALUES (#{name},#{age},DATABASE());
</insert>
<delete id="deleteUserById" parameterType="int">
DELETE FROM `user` WHERE id=#{id}
</delete>
<update id="updateUserById" parameterType="com.syr.api.entity.User">
UPDATE `user` SET `name`=#{name},`age`=#{age} WHERE id=#{id}
</update>
</mapper>
新建UserMapper類如下:
package com.syr.provider.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import com.syr.api.entity.User;
@Mapper
public interface UserMapper {
User getUserById(int id);
List<User> getUsersAll();
boolean addUser(User user);
boolean deleteUserById(int id);
boolean updateUserById(User user);
}
UserService:
package com.syr.provider.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.syr.api.entity.User;
import com.syr.provider.mapper.UserMapper;
@Service
public class UserService {
@Autowired
private UserMapper mapper;
public User getUser(int id) {
User user = mapper.getUserById(id);
return user;
}
public List<User> getUsers() {
List<User> users = mapper.getUsersAll();
return users;
}
public boolean addUser(User user) {
boolean b = mapper.addUser(user);
return b;
}
public boolean deleteUser(int id) {
boolean b = mapper.deleteUserById(id);
return b;
}
public boolean updateUser(User user) {
boolean b = mapper.updateUserById(user);
return b;
}
}
UserController:
package com.syr.provider.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
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.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.syr.api.entity.User;
import com.syr.provider.service.UserService;
@RestController
@RequestMapping("users")
public class UserController {
@Autowired
private UserService service;
@GetMapping(value = "{id}")
public User get(@PathVariable("id")int id) {
User user=service.getUser(id);
return user;
}
@GetMapping
public List<User> get() {
List<User> users=service.getUsers();
return users;
}
@PostMapping
public boolean post(@RequestBody User user) {
boolean b = service.addUser(user);
return b;
}
@DeleteMapping("{id}")
public boolean delete(@PathVariable int id) {
boolean b = service.deleteUser(id);
return b;
}
@PutMapping
public boolean put(@RequestBody User user) {
boolean b = service.updateUser(user);
return b;
}
}
2.測試運行
四、建立服務消費者
通過rest訪問服務提供者
1.創建maven-modul
在microservice父工程中創建microservice-consumer8080子模塊如下:
New -> Maven -> Maven Module
pom文件:
<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>com.syr.springcloud</groupId>
<artifactId>microservice</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>microservice-consumer8080</artifactId>
<dependencies>
<dependency>
<groupId>com.syr.springcloud</groupId>
<artifactId>microservice-api</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 修改後立即生效,熱部署 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
</dependencies>
</project>
application.yml:
server:
port: 8080
創建rest工廠:
package com.syr.consumer.configbean;
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 restTemplate() {
return new RestTemplate();
}
}
創建UserController類,通過rest訪問服務提供者:
package com.syr.consumer.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
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.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import com.syr.api.entity.User;
@RestController
@RequestMapping("users")
public class UserController {
private final String REST_URI="http://localhost:1001/users";
@Autowired
private RestTemplate restTemplate;
@GetMapping(value = "{id}")
public User get(@PathVariable("id")int id) {
User user=restTemplate.getForObject(REST_URI+"/"+id, User.class);
return user;
}
@GetMapping
public List<User> get() {
List<User> users=restTemplate.getForObject(REST_URI, List.class);
return users;
}
@PostMapping
public boolean post(@RequestBody User user) {
boolean b = restTemplate.postForObject(REST_URI, user, boolean.class);
return b;
}
@DeleteMapping("{id}")
public void delete(@PathVariable int id) {
restTemplate.delete(REST_URI+"/"+id);
}
@PutMapping
public void put(@RequestBody User user) {
restTemplate.put(REST_URI, user);
}
}