springcloud 第1课 :Rest学习环境搭建—服务提供者
springcloud 第2课 :Rest学习环境搭建—服务消费者
springcloud 第3课 :Eureka是什么
springcloud 第4课 :Eureka服务注册、信息配置、自我保护机制
springcloud 第5课 :Eureka集群环境配置
springcloud 第6课 :Ribbon实现负载均衡
1、新建springcloud-consumer-dept-feign模块
feign案例的目录结构图,全部复制springcloud-consumer-dept-80
1.1、导入pom依赖
<dependencies>
<!--实体类-->
<dependency>
<groupId>org.example</groupId>
<artifactId>springcloud-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--web启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--热部署-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
<!--Ribbon-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
<version>1.4.7.RELEASE</version>
</dependency>
<!--eureka-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
<!--feign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
<version>1.4.7.RELEASE</version>
</dependency>
</dependencies>
1.2、配置文件 application.yaml
server:
port: 80
#Eureka配置
eureka:
client:
register-with-eureka: false #不向eureka注册自己
service-url:
defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
1.3、配置类 ConfigureBean
package com.lian.springcloud.config;
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;
@Configuration
public class ConfigureBean {
//配置负载均衡实现RestTemplate,ribbon的作用
/**
* IRule
* RoundRobinRule 轮询
* RandomRule 随机
* AvailabilityFilteringRule:会先过滤掉,跳闸,访问故障的服务,对剩下的进行轮询
* RetryRule:会先按照轮询获取服务,如果服务获取失败,则会在指定的时间内进行,重试
*/
@LoadBalanced //ribbon,基于客户端实现负载均衡
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
1.4、控制层 DeptConsumerController
package com.lian.springcloud.controller;
import com.lian.springcloud.pojo.Dept;
import com.lian.springcloud.service.DeptClientService;
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 java.util.List;
@RestController
public class DeptConsumerController {
@Autowired
private DeptClientService service = null;
@RequestMapping("/consumer/dept/get/{id}")
public Dept get(@PathVariable("id") Long id){
return this.service.queryById(id);
}
@RequestMapping("/consumer/dept/list")
public List<Dept> list(){
return this.service.queryAll();
}
@RequestMapping("/consumer/dept/add")
public boolean add(Dept dept){
return this.service.addDept(dept);
}
}
1.5、主启动类 FeignDeptConsumer_80
package com.lian.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.ComponentScan;
/**
* name是要负载均衡的服务名,服务名下有多个生产者提供的服务,采用MyRule负载均衡算法,此处的负载均衡算法是随机
* 在微服务启动的时候就能加载我们自定义的Ribbon类,实现负载均衡算法
*/
@ComponentScan("com.lian.springcloud")
@EnableFeignClients(basePackages = "com.lian.springcloud")
@EnableEurekaClient
@SpringBootApplication
public class FeignDeptConsumer_80 {
public static void main(String[] args) {
SpringApplication.run(FeignDeptConsumer_80.class,args);
}
}
2、springcloud-api 远程服务调用
目录结构图
2.1、pom依赖
<!--当前的module自己需要的依赖,如果父依赖中已经配置了版本,这里就不用写了-->
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--feign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
<version>1.4.7.RELEASE</version>
</dependency>
</dependencies>
2.2、实体类 Dept
package com.lian.springcloud.pojo;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* 实体类 类和数据库表,关系映射
* 必须要实现序列化,序列化是为了解决在对对象流进行读写操作时所引发的问题
*/
@Data
@NoArgsConstructor
@Accessors(chain = true) //链式写法
public class Dept implements Serializable {
private Long deptno;
private String dname;
//判断这个数据是存在哪个数据库的字段,一个服务对应一个数据库,同一个信息可能存在不同的数据库
private String dbsource;
public Dept(String dname) {
this.dname = dname;
}
/**
* 链式写法
* Dept dept =new Dept();
* 正常:
* dept.setDeptno(11);
* dept.setDname('ss');
* 链式:
* dept.setDeptno(11).setDname('ss');
*/
}
2.3、服务接口 DeptClientService
package com.lian.springcloud.service;
import com.lian.springcloud.pojo.Dept;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import java.util.List;
@Component
@FeignClient(value = "SPRINGCLOUD-PROVIDER-DEPT")
public interface DeptClientService {
@GetMapping("/dept/get/{id}")
Dept queryById(@PathVariable("id") Long id);
@GetMapping("/dept/list")
List<Dept> queryAll();
@PostMapping("/dept/add")
Boolean addDept(Dept dept);
}
3、测试
启动eureka7001、7002、7003,生产者8001、8002、8003,再启动feign远程调用api服务,成功