soringboot+Springcloud微服务搭建

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;

}

}