从零搭建springboot+springcloud+euerka+feign项目

从零搭建springboot+springcloud+euerka+feign项目

前言

        最近准备写个小项目,想用springboot+springcloud,注册中心选用euerka,对于服务调用选用了风格比较符合平时开发习惯的feign,选择的原因很简单,之前没用过练习一下(手动滑稽),内容比较全,遇到的各种小坑都找到了对应的解决方案,本次搭建过程中遇见的坑全部红色加粗提示,废话不说,开始搭建。

准备

1. maven: 3.5.3

2. jdk: 1.8

3. 开发工具: Idea

目录结构

虽然四个project放在一起了,但我是各自维护pom.xml的

一、搭建注册中心euerka(这步没有坑,很简单就搭好了

1. 修改pom.xml


 
 
  1. <project xmlns="http://maven.apache.org/POM/4.0.0"
  2. xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation= "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0 </modelVersion>
  5. <groupId>com.joab.anime </groupId>
  6. <artifactId>one-for-all-eureka </artifactId>
  7. <version>1.0.0-SNAPSHOT </version>
  8. <parent>
  9. <groupId>org.springframework.boot </groupId>
  10. <artifactId>spring-boot-starter-parent </artifactId>
  11. <version>2.0.3.RELEASE </version>
  12. <relativePath/>
  13. </parent>
  14. <properties>
  15. <project.build.sourceEncoding>UTF-8 </project.build.sourceEncoding>
  16. <project.reporting.outputEncoding>UTF-8 </project.reporting.outputEncoding>
  17. <java.version>1.8 </java.version>
  18. <spring-cloud.version>Finchley.RELEASE </spring-cloud.version>
  19. </properties>
  20. <dependencies>
  21. <dependency>
  22. <groupId>org.springframework.cloud </groupId>
  23. <artifactId>spring-cloud-starter-netflix-eureka-server </artifactId>
  24. </dependency>
  25. <dependency>
  26. <groupId>org.springframework.boot </groupId>
  27. <artifactId>spring-boot-starter-test </artifactId>
  28. <scope>test </scope>
  29. </dependency>
  30. </dependencies>
  31. <dependencyManagement>
  32. <dependencies>
  33. <dependency>
  34. <groupId>org.springframework.cloud </groupId>
  35. <artifactId>spring-cloud-dependencies </artifactId>
  36. <version>${spring-cloud.version} </version>
  37. <type>pom </type>
  38. <scope>import </scope>
  39. </dependency>
  40. </dependencies>
  41. </dependencyManagement>
  42. <build>
  43. <plugins>
  44. <plugin>
  45. <groupId>org.springframework.boot </groupId>
  46. <artifactId>spring-boot-maven-plugin </artifactId>
  47. </plugin>
  48. </plugins>
  49. </build>
  50. </project>

2. 编辑application.yml


 
 
  1. server:
  2. port: 8761
  3. eureka:
  4. instance:
  5. hostname: localhost
  6. client:
  7. registerWithEureka: false
  8. fetchRegistry: false
  9. serviceUrl:
  10. defaultZone: http: //${eureka.instance.hostname}:${server.port}/eureka/
  11. spring:
  12. application:
  13. name: demo-eureka

3. 编辑EurekaApplication.java


 
 
  1. @EnableEurekaServer
  2. @SpringBootApplication
  3. public class EurekaApplication {
  4. public static void main(String[] args) {
  5. SpringApplication.run(EurekaApplication.class);
  6. }
  7. }

4. 启动EurekaApplication,浏览器输入http://localhost:8761/,显示如下证明euerka搭建成功

二、提供服务接口api(该步骤目的是接口与实现分离

1. 修改pom.xml


 
 
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation= "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0 </modelVersion>
  6. <groupId>com.joaby.springclouddemo </groupId>
  7. <artifactId>api </artifactId>
  8. <version>1.0-SNAPSHOT </version>
  9. <parent>
  10. <groupId>org.springframework.boot </groupId>
  11. <artifactId>spring-boot-starter-parent </artifactId>
  12. <version>2.0.3.RELEASE </version>
  13. <relativePath/>
  14. </parent>
  15. <properties>
  16. <project.build.sourceEncoding>UTF-8 </project.build.sourceEncoding>
  17. <project.reporting.outputEncoding>UTF-8 </project.reporting.outputEncoding>
  18. <java.version>1.8 </java.version>
  19. </properties>
  20. <dependencies>
  21. <dependency>
  22. <groupId>org.springframework.boot </groupId>
  23. <artifactId>spring-boot-starter-web </artifactId>
  24. </dependency>
  25. </dependencies>
  26. </project>

2. 提供api接口


 
 
  1. public interface IDemoApi {
  2. /**
  3. * 入参为字段,返回值为字段
  4. */
  5. @RequestMapping(value= "/demo-api/test", method=RequestMethod.GET)
  6. String test(@RequestParam(value = "test") String test);
  7. /**
  8. * 入参为对象,返回值为对象
  9. */
  10. @RequestMapping(value= "/demo-api/user", method=RequestMethod.POST)
  11. User user(@RequestBody User user);
  12. }

注意:

1)不支持@GetMapping @PostMapping,只能用@RequestMapping,通过method指定请求方式;

2)参数传递必须用@RequestParam(value = "test") 注解修饰;

3)传递的参数为对象,必须用@RequestBody修饰;

4)返回值若为对象,对象必须序列化,且必须提供public修饰的无参构造方法(默认是提供的),会报错com.fasterxml.jackson.databind.exc.InvalidDefinitionException,原因是jackson的反序列化需要无参构造函数

*5)尽管路径均为“/demo-api/xxx”,但是笔者在类上使用注解@RequestMapping(value="/demo-api")就无法调通,请读者补充

二、提供服务提供者实现

1. 修改pom.xml


 
 
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation= "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0 </modelVersion>
  6. <groupId>com.joaby.springclouddemo </groupId>
  7. <artifactId>provider </artifactId>
  8. <version>1.0-SNAPSHOT </version>
  9. <parent>
  10. <groupId>org.springframework.boot </groupId>
  11. <artifactId>spring-boot-starter-parent </artifactId>
  12. <version>2.0.3.RELEASE </version>
  13. <relativePath/>
  14. </parent>
  15. <properties>
  16. <project.build.sourceEncoding>UTF-8 </project.build.sourceEncoding>
  17. <project.reporting.outputEncoding>UTF-8 </project.reporting.outputEncoding>
  18. <java.version>1.8 </java.version>
  19. <spring-cloud.version>Finchley.RELEASE </spring-cloud.version>
  20. </properties>
  21. <dependencies>
  22. <dependency>
  23. <!-- 依赖的api -->
  24. <groupId>com.joaby.springclouddemo </groupId>
  25. <artifactId>api </artifactId>
  26. <version>1.0-SNAPSHOT </version>
  27. </dependency>
  28. <dependency>
  29. <groupId>org.springframework.cloud </groupId>
  30. <artifactId>spring-cloud-starter-netflix-eureka-client </artifactId>
  31. </dependency>
  32. <dependency>
  33. <groupId>org.springframework.boot </groupId>
  34. <artifactId>spring-boot-starter-web </artifactId>
  35. </dependency>
  36. <dependency>
  37. <groupId>org.springframework.boot </groupId>
  38. <artifactId>spring-boot-starter-test </artifactId>
  39. <scope>test </scope>
  40. </dependency>
  41. </dependencies>
  42. <dependencyManagement>
  43. <dependencies>
  44. <dependency>
  45. <groupId>org.springframework.cloud </groupId>
  46. <artifactId>spring-cloud-dependencies </artifactId>
  47. <version>${spring-cloud.version} </version>
  48. <type>pom </type>
  49. <scope>import </scope>
  50. </dependency>
  51. </dependencies>
  52. </dependencyManagement>
  53. <build>
  54. <plugins>
  55. <plugin>
  56. <groupId>org.springframework.boot </groupId>
  57. <artifactId>spring-boot-maven-plugin </artifactId>
  58. </plugin>
  59. </plugins>
  60. </build>
  61. </project>

2. 编辑application.yml


 
 
  1. server:
  2. port: 8091
  3. eureka:
  4. #eueka 主机名
  5. instance:
  6. hostname: localhost
  7. client:
  8. #提供者和消费者的注册地址
  9. service-url:
  10. defaultZone: http: //${eureka.instance.hostname}:8761/eureka/
  11. spring:
  12. application:
  13. name: demo-provider

3. 实现服务


 
 
  1. @RestController
  2. public class DemoProvider implements IDemoApi {
  3. @Override
  4. public String test(String test) {
  5. return "test: " + test;
  6. }
  7. @Override
  8. public User user(@RequestBody User user) {
  9. if (user == null) {
  10. user = new User( 10, "Joab-Y");
  11. }
  12. return user;
  13. }
  14. }

3. 编辑ProviderApplication.java


 
 
  1. @SpringBootApplication
  2. @EnableEurekaClient
  3. public class ProviderApplication {
  4. public static void main(String[] args) {
  5. SpringApplication.run(ProviderApplication.class);
  6. }
  7. }

4. 启动ProviderApplication,浏览器输入http://localhost:8091/demo-api/test?test=123,显示如下,服务提供成功

注意:

1)实现类必须用@RestController注解修饰,不然他会去找模板;

2)传递参数如果为对象,该对象必须再次用@RequestBody修饰,不然字段带不过来,仍为null;

四、搭建消费者

1. 修改pom.xml


 
 
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation= "http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0 </modelVersion>
  6. <groupId>com.joaby.springclouddemo </groupId>
  7. <artifactId>customer </artifactId>
  8. <version>1.0-SNAPSHOT </version>
  9. <parent>
  10. <groupId>org.springframework.boot </groupId>
  11. <artifactId>spring-boot-starter-parent </artifactId>
  12. <version>2.0.3.RELEASE </version>
  13. <relativePath/>
  14. </parent>
  15. <properties>
  16. <project.build.sourceEncoding>UTF-8 </project.build.sourceEncoding>
  17. <project.reporting.outputEncoding>UTF-8 </project.reporting.outputEncoding>
  18. <java.version>1.8 </java.version>
  19. <spring-cloud.version>Finchley.RELEASE </spring-cloud.version>
  20. </properties>
  21. <dependencies>
  22. <dependency>
  23. <groupId>org.springframework.boot </groupId>
  24. <artifactId>spring-boot-starter-web </artifactId>
  25. </dependency>
  26. <dependency>
  27. <groupId>org.springframework.boot </groupId>
  28. <artifactId>spring-boot-starter-test </artifactId>
  29. <scope>test </scope>
  30. </dependency>
  31. <dependency>
  32. <groupId>org.springframework.cloud </groupId>
  33. <artifactId>spring-cloud-starter-netflix-eureka-client </artifactId>
  34. </dependency>
  35. <dependency>
  36. <groupId>org.springframework.cloud </groupId>
  37. <artifactId>spring-cloud-starter-openfeign </artifactId>
  38. </dependency>
  39. <!-- 依赖的api -->
  40. <dependency>
  41. <groupId>com.joaby.springclouddemo </groupId>
  42. <artifactId>api </artifactId>
  43. <version>1.0-SNAPSHOT </version>
  44. </dependency>
  45. </dependencies>
  46. <dependencyManagement>
  47. <dependencies>
  48. <dependency>
  49. <groupId>org.springframework.cloud </groupId>
  50. <artifactId>spring-cloud-dependencies </artifactId>
  51. <version>${spring-cloud.version} </version>
  52. <type>pom </type>
  53. <scope>import </scope>
  54. </dependency>
  55. </dependencies>
  56. </dependencyManagement>
  57. <build>
  58. <plugins>
  59. <plugin>
  60. <groupId>org.springframework.boot </groupId>
  61. <artifactId>spring-boot-maven-plugin </artifactId>
  62. </plugin>
  63. </plugins>
  64. </build>
  65. </project>

2. 编辑application.yml


 
 
  1. server:
  2. port: 8081
  3. spring:
  4. application:
  5. name: demo-customer
  6. eureka:
  7. #eueka 主机名
  8. instance:
  9. hostname: localhost
  10. client:
  11. #提供者和消费者的注册地址
  12. serviceUrl:
  13. defaultZone: http: //${eureka.instance.hostname}:8761/eureka/
  14. feign:
  15. hystrix:
  16. enabled: true

3. 编辑DemoFeignService接口,继承服务api


 
 
  1. // name: 服务者application.yml中的spring.application.name
  2. // fallback: 断路器执行方法,即方法执行失败调用
  3. @FeignClient(name= "demo-provider", fallback = DemoServiceFallback.class)
  4. public interface DemoFeignService extends IDemoApi {
  5. }

4. 实现断路器类


 
 
  1. @Component
  2. public class DemoServiceFallback implements DemoFeignService {
  3. @Override
  4. public String test(String test) {
  5. return "error";
  6. }
  7. @Override
  8. public User user(User user) {
  9. return null;
  10. }
  11. }

5. 前端调用


 
 
  1. @RestController
  2. public class DemoController {
  3. @Autowired
  4. public DemoFeignService demoFeignService;
  5. @RequestMapping( "/test")
  6. public String test() {
  7. return demoFeignService.test( "test");
  8. }
  9. @RequestMapping( "/user")
  10. public User user() {
  11. User user = new User();
  12. user.setAge( 10);
  13. user.setName( "Joab-Y");
  14. return demoFeignService.user(user);
  15. }
  16. }

6. 编辑CustomerApplicaton.java


 
 
  1. @SpringBootApplication
  2. @EnableEurekaClient
  3. @EnableDiscoveryClient
  4. @EnableFeignClients
  5. public class CustomerApplicaton {
  6. public static void main(String[] args) {
  7. SpringApplication.run(CustomerApplicaton.class, args);
  8. }
  9. }

7. 启动CustomerApplicaton

浏览器输入http://localhost:8081/test,显示如下

浏览器输入http://localhost:8081/user,显示如下

若断开provider,浏览器输入http://localhost:8081/test,显示如下(断路器生效)

完结撒花~

您好!对于搭建Spring BootSpring Cloud项目,您可以按照以下步骤进行操作: 1. 首先,确保您已经安装了Java和Maven,并且配置了正确的环境变量。 2. 创建一个新的Spring Boot项目。您可以使用Spring Initializr(https://start.spring.io/)来生成一个基本的Spring Boot项目结构。在这个网站上,您可以选择Spring Boot的版本、项目的元数据以及一些必要的依赖。 3. 导入项目到您的开发工具中。如果您使用的是IntelliJ IDEA,可以选择"Import Project"并选择您刚刚生成的项目文件夹。如果您使用的是Eclipse,可以选择"Import" -> "Existing Maven Projects"。 4. 在项目中添加Spring Cloud依赖。根据您的需求,可以添加Spring Cloud的不同组件,例如Eureka(服务注册与发现)、Ribbon(客户端负载均衡)、Feign(声明式REST客户端)、Zuul(API网关)等。您可以在Maven的pom.xml文件中添加相应的依赖。 5. 配置Spring Cloud组件。根据您选择的组件,您需要在application.properties或application.yml文件中进行相应的配置。例如,如果您使用Eureka进行服务注册与发现,您需要配置Eureka服务器的地址、端口等信息。 6. 编写业务逻辑。根据您的项目需求,编写相应的业务逻辑代码。您可以创建控制器、服务、数据访问层等组件来实现您的功能。 7. 运行项目。您可以在开发工具中运行项目,或者使用Maven命令进行打包和运行。例如,使用"Maven clean package"命令进行打包,然后使用"java -jar"命令运行生成的jar文件。 这些是搭建Spring BootSpring Cloud项目的基本步骤。当然,具体的细节和配置可能会根据您的项目需求有所不同。希望对您有所帮助!如有任何问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值