1、参考网址java
基于SpringBoot 2.0正式版的SpringCloud的微服务实战项目搭建web
http://www.javashuo.com/article/p-rxasifsn-dn.htmlspring
2、注意事项apache
应该建立三个工程app
一、服务发现者负载均衡
@SpringBootApplicationmaven
@EnableEurekaServerspring-boot
public class FindApplication {微服务
public static void main(String[] args) {工具
SpringApplication.run(FindApplication.class, args);
}
}
<?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.gsww</groupId>
<artifactId>hzz-rest-find</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>hzz-rest-find</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.M1</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-server</artifactId>
<version>1.17.1</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-core</artifactId>
<version>1.17.1</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-servlet</artifactId>
<version>1.17.1</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</project>
二、服务调用者
package com.gsww.transfer;
import javax.servlet.MultipartConfigElement;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.web.servlet.MultipartConfigFactory;
import org.springframework.cloud.client.SpringCloudApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
/**
* @ClassName: TransferApplication
* @Description: 服务调度者
* @author 强周亮
* @date 2018年11月15日 下午9:41:56
*/
@SpringCloudApplication
@EnableZuulProxy
public class TransferApplication {
public static void main(String[] args) {
SpringApplication.run(TransferApplication.class, args);
}
/**
* @Title: restTemplate
* @Description: 负载均衡配置
* @author 强周亮
* @param @return 参数
* @return RestTemplate 返回类型
* @date 2018年11月15日 下午8:06:38
* @throws
*/
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
/**
* 文件上传配置
* @return
*/
@Bean
public MultipartConfigElement multipartConfigElement() {
MultipartConfigFactory factory = new MultipartConfigFactory();
//单个文件最大
factory.setMaxFileSize("20480KB"); //KB,MB
/// 设置总上传数据总大小
factory.setMaxRequestSize("204800KB");
return factory.createMultipartConfig();
}
}
<?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.gsww</groupId>
<artifactId>hzz-rest-transfer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>hzz-rest-transfer</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.M1</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-server</artifactId>
<version>1.17.1</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-core</artifactId>
<version>1.17.1</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-servlet</artifactId>
<version>1.17.1</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</project>
三、服务
服务调用者和服务都要加入服务观察这种
3、调用方法
/**
* @Title: MyCon.java
* @Package com.example.cloud
* @Description: TODO(用一句话描述该文件作什么)
* @author 强周亮
* @date 2018年11月13日 下午5:15:20
* @version V1.0
*/
package com.gsww.transfer;
import java.io.File;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.Collection;
import java.util.Iterator;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
import org.springframework.http.ResponseEntity;
import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import com.gsww.transfer.util.Util;
/**
* @ClassName: MyCon
* @Description: 调运服务观察者的公共类
* @author 强周亮
* @date 2018年11月13日 下午5:15:20
*
*/
@RestController
public class MyCon {
@Autowired
private RestTemplate restTemplate;
//临时文件夹路径
@Value("${tempPath}")
private String tempPath;
//服务地址
@Value("${servicePath}")
private String servicePath;
/**
* get请求图片和文件下载
*/
@RequestMapping(value={"/hzz/show/**","/hzz/download/**"})
public void getFile(HttpServletRequest request, HttpServletResponse response){
String servletPath=request.getServletPath();
//请求参数
String parames = Util.getParamter(request.getParameterMap());
ResponseEntity<Resource> responseEntity = restTemplate.getForEntity(servicePath+servletPath+parames,Resource.class);
if (responseEntity != null && responseEntity.getBody() != null) {
if (servletPath.contains("show")) {
//查看
response.reset();
response.setContentType("image/jpeg");
try {
response.getOutputStream().write(Util.input2byte(responseEntity.getBody().getInputStream()));
response.getOutputStream().close();
} catch (IOException e) {
e.printStackTrace();
}
}else{
//下载
response.setContentType("application/octet-sream");
try {
if (request.getParameter("fileName") != null) {
response.addHeader("Content-Disposition",
"attachment;fileName=" + URLEncoder.encode(request.getParameter("fileName"), "UTF-8"));// 设置文件名
response.setContentLength((int) Util.input2byte(responseEntity.getBody().getInputStream()).length);
response.getOutputStream().write(Util.input2byte(responseEntity.getBody().getInputStream()));
response.getOutputStream().close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* @Title: uploadFile
* @Description: 文件上传方法
* @author 强周亮
* @param @param request
* @param @param response
* @param @return 参数
* @return String 返回类型
* @date 2018年11月15日 下午7:53:19
* @throws
*/
@RequestMapping("/hzz/upload")
public String uploadFile(HttpServletRequest request, HttpServletResponse response){
String servletPath=request.getServletPath();
ResponseEntity<String> responseEntity = null;
MultiValueMap map= Util.getPostParamter(request.getParameterMap());
Collection<Part> parts;
try {
parts = request.getParts();
for (Iterator<Part> iterator = parts.iterator(); iterator.hasNext();) {
Part part = iterator.next();
if ("file".equals(part.getName())) {
File file = new File(tempPath);
if (!file.exists() && !file.isDirectory()) {
file.mkdirs();
}
//先删掉临时文件下的全部文件
Util.deleteDir(new File(tempPath));
File targetFile = new File(tempPath+"/"+part.getSubmittedFileName());
//将输入流转为文件
Util.inputstreamtofile(part.getInputStream(),targetFile);
FileSystemResource resource = new FileSystemResource(targetFile);
map.add("file", resource);
}
}
responseEntity = restTemplate.postForEntity(servicePath+servletPath, map ,String.class);
} catch (Exception e) {
e.printStackTrace();
}
return responseEntity.getBody();
}
/**
* get请求数据
*/
@RequestMapping("/hzz/rest/**")
public String get(HttpServletRequest request, HttpServletResponse response){
String servletPath=request.getServletPath();
ResponseEntity<String> responseEntity = null;
//请求参数
String parames = Util.getParamter(request.getParameterMap());
responseEntity = restTemplate.getForEntity(servicePath+servletPath+parames,String.class);
return responseEntity.getBody();
}
}
工具类
/**
* @Title: Util.java
* @Package com.example.clientorder.util
* @Description: TODO(用一句话描述该文件作什么)
* @author 强周亮
* @date 2018年11月15日 下午5:13:11
* @version V1.0
*/
package com.gsww.transfer.util;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
/**
* @ClassName: Util
* @Description: 工具类
* @author 强周亮
* @date 2018年11月15日 下午5:13:11
*
*/
public class Util {
/**
* @Title: getPostParamter
* @Description: 获取请求get参数
* @author 强周亮
* @param @param map
* @param @return 参数
* @return String 返回类型
* @date 2018年11月15日 上午10:24:54
* @throws
*/
public static String getParamter(Map map) {
Set keSet=map.entrySet();
String string = "?";
for(Iterator itr=keSet.iterator();itr.hasNext();){
Map.Entry me=(Map.Entry)itr.next();
Object ok=me.getKey();
Object ov=me.getValue();
String[] value=new String[1];
if(ov instanceof String[]){
value=(String[])ov;
}else{
value[0]=ov.toString();
}
for(int k=0;k<value.length;k++){
string +=ok+"="+value[k]+"&";
}
}
return string;
}
/**
* @Title: input2byte
* @Description: 字节流转换为byte
* @author 强周亮
* @param @param inStream
* @param @return
* @param @throws IOException 参数
* @return byte[] 返回类型
* @date 2018年11月15日 下午5:11:31
* @throws
*/
public static byte[] input2byte(InputStream inStream) throws IOException {
ByteArrayOutputStream swapStream = new ByteArrayOutputStream();
byte[] buff = new byte[100];
int rc = 0;
while ((rc = inStream.read(buff, 0, 100)) > 0) {
swapStream.write(buff, 0, rc);
}
byte[] in2b = swapStream.toByteArray();
return in2b;
}
/**
* @Title: inputstreamtofile
* @Description: 输入流转文件
* @author 强周亮
* @param @param ins
* @param @param file 参数
* @return void 返回类型
* @date 2018年11月15日 下午5:16:09
* @throws
*/
public static void inputstreamtofile(InputStream ins,File file){
OutputStream os;
try {
os = new FileOutputStream(file);
int bytesRead = 0;
byte[] buffer = new byte[8192];
while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
os.write(buffer, 0, bytesRead);
}
os.close();
ins.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* @Title: getParamter
* @Description: 获取post参数
* @author 强周亮
* @param @param map
* @param @return 参数
* @return String 返回类型
* @date 2018年11月14日 下午8:23:51
* @throws
*/
public static MultiValueMap getPostParamter(Map map) {
Set keSet=map.entrySet();
MultiValueMap valueMap= new LinkedMultiValueMap();
for(Iterator itr=keSet.iterator();itr.hasNext();){
Map.Entry me=(Map.Entry)itr.next();
Object ok=me.getKey();
Object ov=me.getValue();
String[] value=new String[1];
if(ov instanceof String[]){
value=(String[])ov;
}else{
value[0]=ov.toString();
}
for(int k=0;k<value.length;k++){
valueMap.add(ok, value[k]);
}
}
return valueMap;
}
/**
* 递归删除目录下的全部文件及子目录下全部文件
* @param dir 将要删除的文件目录
* @return boolean Returns "true" if all deletions were successful.
* If a deletion fails, the method stops attempting to
* delete and returns "false".
*/
public static boolean deleteDirFile(File dir) {
if (dir.isDirectory()) {
String[] children = dir.list();
//递归删除目录中的子目录下
for (int i=0; i<children.length; i++) {
new File(dir, children[i]).delete();
}
}
return true;
}
/**
* 递归删除目录下的全部文件及子目录下全部文件
* @param dir 将要删除的文件目录
* @return boolean Returns "true" if all deletions were successful.
* If a deletion fails, the method stops attempting to
* delete and returns "false".
*/
public static boolean deleteDir(File dir) {
if (dir.isDirectory()) {
String[] children = dir.list();
//递归删除目录中的子目录下
for (int i=0; i<children.length; i++) {
boolean success = deleteDir(new File(dir, children[i]));
if (!success) {
return false;
}
}
}
return true;
}
}