SpringBoot集成Nacos以及Feign集成调用
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