1.继上一篇文章中写到nacos在linux环境下的安装使用,本篇文章写到nacos在实际项目中的应用,首先我们建两个springBoot项目为nacos_server 、nacos_client 这里不多介绍怎么去创建项目了 先看下两个项目整体构成:
2.nacos_server项目的pom.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 https://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.2.12.BUILD-SNAPSHOT</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>net.longjin</groupId>
<artifactId>nacos_server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>nacos_server</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud-alibaba.version>2.2.1.RELEASE</spring-cloud-alibaba.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>RELEASE</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.72</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.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>
</repository>
<repository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
</pluginRepository>
<pluginRepository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</project>
3.nacos_server项目启动类引入以下两个注解:@EnableDiscoveryClient(注册中心注册发现)、@EnableFeignClients(feign客户端调用)
4.application.yml配置如下:
#当前使用配置配置
spring:
profiles:
active: dev
logging:
level:
com:
alibaba:
nacos:
client:
naming: error
5.bootstrap.yml配置如下:
server:
port: 9740
servlet:
context-path: /ns
max-http-header-size: 10240
tomcat:
uri-encoding: UTF-8
max-threads: 500
max-connections: 10000
config:
nacos:
ip: 192.168.108.132
port: 8848
spring:
application:
name: nacosServerCenter
cloud:
nacos:
discovery:
server-addr: ${config.nacos.ip}:${config.nacos.port}
#以下配置在不需要配置中心的情况下可以注释掉
config:
server-addr: ${config.nacos.ip}:${config.nacos.port}
group: PROD_GROUP
prefix: application-prod
file-extension: yml
6.nacos集成主要用到以上两个配置文件 至于application-dev.yml 、application-prod.yml、logback-spring.xml这三个配置文件这里就不多讲了 dev和prod测试正式环境根据自己实际项目配置数据源等一些配置 logback-spring.xml文件是日志配置 这里根据自己项目实际去配置 最后我也会附上完整代码参考
7.nacos_server项目新建一个student的实体类:
package net.longjin.entity;
import lombok.Data;
/**
* 描述:Student
*
* @author 何志鹏
* @ClassName:Student
* @create 2020-11-17 16:51
* Version 1.0
*/
@Data
public class Student {
/**
* 主键id
*/
private Long id;
/**
* 姓名
*/
private String name;
/**
* 年龄
*/
private Integer age;
}
8.nacos_server项目新建一个student类的service层:
package net.longjin.service;
import com.alibaba.fastjson.JSONObject;
/**
* 描述:StudentService
*
* @author 何志鹏
* @ClassName:StudentService
* @create 2020-11-17 16:54
* Version 1.0
*/
public interface StudentService {
/**
* 获取学生信息
*
* @return
*/
JSONObject getInfos();
}
9.nacos_server项目新建一个student类的service实现层:
package net.longjin.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import net.longjin.entity.Student;
import net.longjin.service.StudentService;
import org.springframework.stereotype.Service;
/**
* 描述:StudentServiceImpl
*
* @author 何志鹏
* @ClassName:StudentServiceImpl
* @create 2020-11-17 17:10
* Version 1.0
*/
@Service
public class StudentServiceImpl implements StudentService {
/**
* 获取学生信息
*
* @return
*/
@Override
public JSONObject getInfos() {
Student student = new Student();
student.setId(1L);
student.setName("何志鹏");
student.setAge(30);
return JSONObject.parseObject(JSON.toJSONString(student));
}
}
10.nacos_server项目新建一个student类的controller层:
package net.longjin.controller;
import com.alibaba.fastjson.JSONObject;
import net.longjin.service.StudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 描述:StudentController
*
* @author 何志鹏
* @ClassName:StudentController
* @create 2020-11-17 17:14
* Version 1.0
*/
@RestController
@RequestMapping("/api/student")
public class StudentController {
@Autowired
private StudentService studentService;
/**
* 获取学生信息
*
* @return
*/
@RequestMapping("/getInfos")
public JSONObject getInfos(){
return studentService.getInfos();
}
}
11.启动nacos_server项目后 登录nacos发现nacos_server注册到注册中心了 如下:
12.然后新建一个nacos_client项目 其项目的application.yml、bootstrap.yml、application-dev.yml 、application-prod.yml、logback-spring.xml 、pom.xml 启动类等与nacos_server一样 新建一个feign调用的FeignMultipartSupportConfig、主要解决跨服务调用多文件上传 入用不到可忽略:
package net.longjin.feignClient;
import feign.RequestTemplate;
import feign.codec.EncodeException;
import feign.codec.Encoder;
import feign.form.ContentType;
import feign.form.FormEncoder;
import feign.form.MultipartFormContentProcessor;
import feign.form.spring.SpringManyMultipartFilesWriter;
import feign.form.spring.SpringSingleMultipartFileWriter;
import org.springframework.beans.factory.ObjectFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
import org.springframework.cloud.openfeign.support.SpringEncoder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.multipart.MultipartFile;
import java.lang.reflect.Type;
import java.util.*;
/***
* @author: 何志鹏
* @Date: 2019/10/10
*/
@Configuration
public class FeignMultipartSupportConfig {
@Autowired
private ObjectFactory<HttpMessageConverters> messageConverters;
@Bean
public Encoder feignEncoder() {
return new SpringMultipartEncoder(new SpringEncoder(messageConverters));
}
private class SpringMultipartEncoder extends FormEncoder {
public SpringMultipartEncoder(Encoder delegate) {
super(delegate);
MultipartFormContentProcessor processor = (MultipartFormContentProcessor) this.getContentProcessor(ContentType.MULTIPART);
processor.addFirstWriter(new SpringSingleMultipartFileWriter());
processor.addFirstWriter(new SpringManyMultipartFilesWriter());
}
@Override
public void encode(Object object, Type bodyType, RequestTemplate template) throws EncodeException {
if (bodyType.equals(MultipartFile[].class)) {
MultipartFile[] files = (MultipartFile[]) ((MultipartFile[]) object);
HashMap data = new HashMap(files.length, 1.0F);
data.put(files[0].getName(), Arrays.asList(files));
super.encode(data, MAP_STRING_WILDCARD, template);
} else if (bodyType.equals(MultipartFile.class)) {
MultipartFile file = (MultipartFile) object;
Map<String, Object> data = Collections.singletonMap(file.getName(), object);
super.encode(data, MAP_STRING_WILDCARD, template);
} else if ((object instanceof Iterable) && ((Iterable) object).iterator().hasNext() && ((Iterable) object).iterator().next() instanceof MultipartFile) {
Iterable<?> iterable = (Iterable) object;
HashMap data = new HashMap();
Iterator var13 = iterable.iterator();
while (var13.hasNext()) {
Object item = var13.next();
MultipartFile file = (MultipartFile) item;
data.put(file.getName(), file);
}
super.encode(data, MAP_STRING_WILDCARD, template);
} else {
super.encode(object, bodyType, template);
}
}
}
}
13.新建一个StudentrFeignClient的方法 用来调用nacos_server中的/api/student/getInfos接口 代码如下:
package net.longjin.feignClient;
import com.alibaba.fastjson.JSONObject;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@FeignClient(name = "nacosServerCenter", path = "ns")
public interface StudentrFeignClient {
/**
* 获取学生信息
*
* @return
*/
@RequestMapping(value = "/api/student/getInfos", method = RequestMethod.GET)
JSONObject getInfos();
}
14.新建一个调用获取学生信息的controller层 代码如下:
package net.longjin.controller;
import com.alibaba.fastjson.JSONObject;
import net.longjin.feignClient.StudentrFeignClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 描述:studentController
*
* @author 何志鹏
* @ClassName:studentController
* @create 2020-11-17 17:22
* Version 1.0
*/
@RestController
@RequestMapping("api/stu")
public class studentController {
@Autowired
private StudentrFeignClient studentrFeignClient;
/**
* 获取学生信息
*
* @return
*/
@RequestMapping("/getInfos")
public JSONObject getInfos(){
return studentrFeignClient.getInfos();
}
}
15.启动nacos_client项目 看到nacos_client项目已经注册到注册中心里了 然后用postman调用就能跨服务调用nacos_server中的服务:
16.最后附上源代码地址:
https://gitee.com/hezhipeng_ek/nacos.git