SpringCloud全家桶 (第二期:远程调用Feign)

一: 什么是SpringCloud

Spring Cloud provides tools for developers to quickly build some of the common patterns in distributed systems (e.g. configuration management, service discovery, circuit breakers, intelligent routing, micro-proxy, control bus, one-time tokens, global locks, leadership election, distributed sessions, cluster state). Coordination of distributed systems leads to boiler plate patterns, and using Spring Cloud developers can quickly stand up services and applications that implement those patterns. They will work well in any distributed environment, including the developer’s own laptop, bare metal data centres, and managed platforms such as Cloud Foundry.

翻译如下

Spring Cloud为开发人员提供了快速构建分布式系统中的一些常见模式的工具(例如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导层选举、分布式会话、集群状态)。分布式系统的协调导致了锅炉板模式,使用Spring Cloud开发人员可以快速建立实现这些模式的服务和应用程序。它们在任何分布式环境中都能很好地工作,包括开发人员自己的笔记本电脑、裸机数据中心和云计算等托管平台。

SpringCloud主要框架

二:创建两个微服务

  • pin_user
  • pin_teacher

模拟场景:老师(服务)要调用学生(服务),他们分别在两个服务中,怎么调用呢??

需求:老师要查询所有的学生年龄!!

创建pin_user,导入依赖

<?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>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.7.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.ml</groupId>
    <artifactId>pin_user</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>pin_user</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.0</version>
        </dependency>
		
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            <version>2.1.2.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

1.创建application.yml,加入配置:

server:
  port: 8000
spring:
  application:
    name: pin-user  #服务名称     (切记不能用写成pin_user)
  datasource:
     driverClassName: com.mysql.cj.jdbc.Driver
     url: jdbc:mysql://localhost:3306/ml?characterEncoding=UTF8&serverTimezone=UTC
     username: root
     password: 123456
  profiles:
    active: dev


mybatis:
  mapper-locations: classpath:mapper/**/*.xml
  type-aliases-package:



eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/

2.在启动类上加上注解@EnableDiscoveryClient(开启服务发现),@EnableEurekaClient(可省略)
@MapperScan:扫描mapper接口
在这里插入图片描述

@EnableEurekaClient(可省略):因为引入spring-cloud-starter-netflix-eureka-client会默认加上@EnableEurekaClient

查询所有学生接口
在这里插入图片描述

创建pin_teacher,导入pom

<?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>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.7.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.ml</groupId>
    <artifactId>pin_teacher</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>pin_teacher</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.0</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            <version>2.1.2.RELEASE</version>
        </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-openfeign</artifactId>
            <version>2.1.2.RELEASE</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

创建application.yml,加入以下配置:

server:
  port: 8001
spring:
  application:
    name: pin-teacher  #服务名称     (切记不能用写成pin_user)
  datasource:
     driverClassName: com.mysql.cj.jdbc.Driver
     url: jdbc:mysql://localhost:3306/ml?characterEncoding=UTF8&serverTimezone=UTC
     username: root
     password: 123456
  profiles:
    active: dev

mybatis:
  mapper-locations: classpath:mapper/**/*.xml
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/

2.在启动类上加上注解@EnableDiscoveryClient(开启服务发现),@EnableEurekaClient(可省略)
@EnableFeignClients (用来开启Feign功能)

在这里插入图片描述

三:Feign实现服务间的调用

1.在pin_teacher中模块中添加依赖:

<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-openfeign</artifactId>
		</dependency>

提示:在调用者的服务上操作,被调用者的服务无需操作。

2.修改pin_teacher模块的启动类,添加注解

//开启服务发现功能
@EnableDiscoveryClient
//开启Feign功能
@EnableFeignClients

3.在pin_teacher模块中,创建com.pin_teacher.feign,包下创建接口
com.pin_teacher.feign.TeacherFeign

import com.ml.pin_teacher.model.Student;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;

import java.util.List;


@FeignClient("pin-user") //既然是远程调用,那么是调哪个服务呢?这个注解指定微服务的名称,即:pin-user
public interface TeacherFeign {

    @RequestMapping("student")  //要和pin_user中查询所有学生的接口路径完全一致
    List<Student> findAll();

}

@FeignClient注解用于指定从哪个服务中调用功能 ,注意 里面的名称与被调用的服务名保持一致,并且不能包含下划线。
@GetMapping@RequestMapping注解用于对被调用的微服务进行地址映射。注意 @PathVariable注解一定要指定参数名称,否则出错

4.在pin_teacher模块中调用pin_user模块中的查询学生方法:

@RestController
@RequestMapping("teacher")
public class TeacherController {

    @Autowired       //注入Feign的TeacherFeign
    private TeacherFeign teacherFeign;

    @RequestMapping("findStudent")
    public List<Student> findAll(){
        List<Student> students = null;
        try {
            students = teacherFeign.findAll();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return students;
    }
}

5.环境搭建好之后,启动查看是否注册到eureka注册中心上?
在这里插入图片描述
可见,pin_teacher和pin_user服务已经注册到eureka上

6.调用

a.通过pin_user服务直接调用查询所有学生接口:如下图
在这里插入图片描述

b.通过pin_teacher服务直接调用查询所有学生接口:如下图

在这里插入图片描述

四:常见错误:

开心一刻

小孩把妓院养的鹦鹉偷回家,一进门,鹦鹉便叫:搬家啦!看见他妈妈又叫:老板也换啦!看见他姐姐又叫:小姐也换了!看见他爸爸又叫:我cao还是老客!
在这里插入图片描述

如果觉得不错,帮忙点个赞,您的点赞将是我的动力!

上一篇:服务注册与发现
下一篇:熔断器Hystrix

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值