搭建springcloud的demo之Feign工程构建(六)

Feign的使用步骤

Feign只需要创建一个接口,然后在上面添加注解即可;

新建microservicecloud-consumer-dept-feign
在这里插入图片描述
microservicecloud-consumer-dept-feign工程的pom.xml,主要添加对feign的支持
在这里插入图片描述
在这里插入图片描述

<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>com.yt.springcloud</groupId>
    <artifactId>microservicecloud</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <artifactId>microservicecloud-consumer-dept-feign</artifactId>
  
  <dependencies>
  
  	<dependency><!-- 自己定义的api -->
  		<groupId>com.yt.springcloud</groupId> 
  		<artifactId>microservicecloud-api</artifactId>
  		<version>${project.version}</version>
  	</dependency>
  	
  	<dependency><!-- springboot-web -->
  		<groupId>org.springframework.boot</groupId>
  		<artifactId>spring-boot-starter-web</artifactId>
  	</dependency>
  	
  	 <!-- 修改后立即生效,热部署 (一修改,自动发布,自动构建)-->
  	<dependency>
  		<groupId>org.springframework</groupId>
  		<artifactId>springloaded</artifactId>
  	</dependency>
  	<dependency>
  		<groupId>org.springframework.boot</groupId>
  		<artifactId>spring-boot-devtools</artifactId>
  	</dependency>
  	
  		<!-- Ribbon相关 (eureka后面没有server的就是客户端,ribbon要跟eureka整合,类似于mysql和java的驱动包)-->
  	<dependency>
  		<groupId>org.springframework.cloud</groupId>
  		<artifactId>spring-cloud-starter-eureka</artifactId>
  	</dependency>
  	<dependency>
  		<groupId>org.springframework.cloud</groupId>
  		<artifactId>spring-cloud-starter-ribbon</artifactId>
  	</dependency>
  	<dependency>
  		<groupId>org.springframework.cloud</groupId>
  		<artifactId>spring-cloud-starter-config</artifactId>
  	</dependency>
  	
  	<!-- feign的依赖 -->
	<dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-starter-feign</artifactId>
	</dependency>
	
  </dependencies>
  
</project>  

修改microservicecloud-api工程的pom.xml
在这里插入图片描述

<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>com.yt.springcloud</groupId>
		<artifactId>microservicecloud</artifactId>
		<version>0.0.1-SNAPSHOT</version>
	</parent>
	
	<artifactId>microservicecloud-api</artifactId><!-- 当前Module我自己叫什么名字 -->


	<dependencies><!-- 当前Module需要用到的jar包,按照自己的需求添加,如果父类已经包含了,可以不用写版本号 -->
		
		<!-- 实体类的自动生成set,get,全参构造方法,toString等等 -->
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId> 
		</dependency>
		
		<!-- feign的依赖 -->
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-feign</artifactId>
		</dependency>
		
	</dependencies>
</project>

microservicecloud-api工程添加一个DeptClientService接口并新增注解@FeignClient
在这里插入图片描述

package com.yt.springcloud.service;

import java.util.List;

import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.yt.springcloud.entity.Dept;

/**
 * 
 * @Description: 修改microservicecloud-api工程,根据已经有的DeptClientService接口
 * 一个实现了FallbackFactory接口的类DeptClientServiceFallbackFactory
 * @author zzyy
 * @date 2018年4月21日
 */
@FeignClient(value = "MICROSERVICECLOUD-DEPT")//针对于更细粒化的控制,针对哪一个微服务进行面向接口的feign的
//@FeignClient(value = "MICROSERVICECLOUD-DEPT",fallbackFactory=DeptClientServiceFallbackFactory.class)
public interface DeptClientService
{
	@RequestMapping(value = "/dept/get/{id}", method = RequestMethod.GET)
	public Dept get(@PathVariable("id") long id);

	@RequestMapping(value = "/dept/list", method = RequestMethod.GET)
	public List<Dept> list();

	@RequestMapping(value = "/dept/add", method = RequestMethod.POST)
	public boolean add(Dept dept);
}


对api公共项目工程maven clean–>maven install
microservicecloud-consumer-dept-feign工程修改Controller,
添加上一步新建的DeptClientService

在这里插入图片描述

package com.yt.springcloud.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.yt.springcloud.entity.Dept;
import com.yt.springcloud.service.DeptClientService;

@RestController
public class DeptController_consumer {
	
	@Autowired
	private DeptClientService service;

	@RequestMapping(value = "/consumer/dept/get/{id}")
	public Dept get(@PathVariable("id") Long id)
	{
		return this.service.get(id);
	}

	@RequestMapping(value = "/consumer/dept/list")
	public List<Dept> list()
	{
		return this.service.list();
	}

	@RequestMapping(value = "/consumer/dept/add")
	public Object add(Dept dept)
	{
		return this.service.add(dept);
	}
}
 

microservicecloud-consumer-dept-feign工程修改主启动类
在这里插入图片描述

package com.yt.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.feign.EnableFeignClients;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients(basePackages= {"com.yt.springcloud"})
@ComponentScan("com.yt.springcloud")
public class DeptConsumer80_Feign_App {
	
	public static void main(String[] args) {
		SpringApplication.run(DeptConsumer80_Feign_App.class, args);
	}

}

测试
先启动3个rureka项目工程,再驱动8001,8002,8003,和feign项目工程
测试路径:http://localhost/consumer/dept/list
在这里插入图片描述

如果控制台报了这个异常的话
在这里插入图片描述
去feign项目工程的配置类里面加上一个方法
在这里插入图片描述

package com.yt.springcloud.cfgbeans;

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;

@Configuration//其实就是ApplicationContext.xml
public class ConfigBean {
	
	/**
	 * 注册一个objectMapper覆盖掉默认的,这样就不用在每个类上面使用@jsonIgnoreProperties
	 * @return
	 */
	@Bean
	public ObjectMapper objectMapper() {
		return new ObjectMapper().disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
	}
	
	
	/**
	 * RestTemplate提供了多种便捷访问远程Http服务的方法
	 * 是一种简单便捷的访问restful服务模板类,是Spring提供的用于访问Rest服务的客户端模板工具集
	 * @return
	 */
	@Bean
	@LoadBalanced//ribbon是客户端的负载均衡工具,所以在rest去访问微服务的时候,自带负载均衡,这个注解是开启负载均衡的
	public RestTemplate getRestTemplate() {
		return new RestTemplate();
	}
	
	/**
	 * 自定义负载均衡算法(有7种负载均衡算法)
	 * 有显示的声明算法,就覆盖默认的轮询算法
	 * @return
	 */
	@Bean
	public IRule myRule() {
		
		//return new RoundRobinRule();//轮询算法
		return new RandomRule();//随机算法
	}

}

Feign集成了Ribbon

利用Ribbon维护了microservicecloud-Dept的服务列表信息,并且通过轮询实现了客户端的负载均衡,而与Ribbon不同的是,通过feign只需要定义服务绑定接口且以声明式的方法,优雅而简单的实现了服务调用

Feign通过接口的方法,调用Rest服务(之前是Ribbon+RestTemplate)
该请求发送给Eureka服务器(http://MICROSERVICECLOUD-DEPT/dept/list),通过Feign直接找到服务接口,由于在进行服务调用的时候融合了Ribbon技术,所以也支持负载均衡作用;

总结

在这里插入图片描述
翻译于尚硅谷周阳老师:https://www.bilibili.com/video/av22613028?from=search&seid=11377756339718254280

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值