4.微服務項目的準備

一、搭建maven父工程

父工程的好處在於統一各個項目的jar包版本,防止依賴衝突
New -> Maven -> Maven Project。
新建maven父工程項目
注意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應如下:
子模塊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);
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章