SpringCloud2.x搭建完整Demo(三) -集成Ribbon负载均衡,Feign接口服务
1.集成Ribbon负载均衡(实现负载均衡,全局Ribbon路由配置,提供服务提供方信息)
2.集成Feign接口服务
---------------------------------------------------------------------------------------------------------------------------
1.集成Ribbon负载均衡
1.1 在消费者服务集成Ribbon,修改POM,增加Eureka支持
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
1.2 修改RestConfig配置类,在获取RestTemplate对象的时候加入Ribbon的配置信息
1.3 消费者服务application.yml配置文件增加Eureka配置
eureka:client:register-with-eureka: falseservice-url:defaultZone: http://admin:root@eureka:7001/eureka,http://admin:root@eureka2:7002/eureka,http://admin:root@eureka3:7003/eureka
1.4 消费者服务启动类增加注解
1.5 消费者服务Controller修改请求地址
private static final String PRODUCT_GET_URL = "http://MYSPRINGCLOUD-PROVIDER-PRODUCT/prodcut/getInfoById/";
private static final String PRODUCT_LIST_URL="http://MYSPRINGCLOUD-PROVIDER-PRODUCT/prodcut/getAllInfo/";
private static final String PRODUCT_ADD_URL = "http://MYSPRINGCLOUD-PROVIDER-PRODUCT/prodcut/addInfo/";
1.6 为了体现出负载均衡的效果,复制两个产品服务,在复制两个库
server:port: 8082
mybatis:mapper-locations: # 所有的mapper映射文件- classpath:mapping/*.xml
spring:application:name: myspringcloud-provider-productdatasource:type: com.alibaba.druid.pool.DruidDataSource # 配置当前要使用的数据源的操作类型driver-class-name: com.mysql.cj.jdbc.Driver # 配置MySQL的驱动程序类url: jdbc:mysql://localhost:3306/springcloud2?serverTimezone=GMT%2B8 # 数据库连接地址username: rootpassword: root
logging:level:com.en.mapper: debug
eureka:client: # 客户端进行Eureka注册的配置service-url:defaultZone: http://admin:root@eureka:7001/eureka,http://admin:root@eureka2:7002/eureka,http://admin:root@eureka3:7003/eurekainstance:instance-id: myspringcloud-provider-product2prefer-ip-address: truelease-renewal-interval-in-seconds: 2 # 设置心跳的时间间隔(默认是30秒)lease-expiration-duration-in-seconds: 5 # 如果现在超过了5秒的间隔(默认是90秒)info:app.name: myspringcloud-provider-product2company.name: enbuild.artifactId: $project.artifactId$build.modelVersion: $project.modelVersion$
server:port: 8083
mybatis:mapper-locations: # 所有的mapper映射文件- classpath:mapping/*.xml
spring:application:name: myspringcloud-provider-productdatasource:type: com.alibaba.druid.pool.DruidDataSource # 配置当前要使用的数据源的操作类型driver-class-name: com.mysql.cj.jdbc.Driver # 配置MySQL的驱动程序类url: jdbc:mysql://localhost:3306/springcloud3?serverTimezone=GMT%2B8 # 数据库连接地址username: rootpassword: root
logging:level:com.en.mapper: debug
eureka:client: # 客户端进行Eureka注册的配置service-url:defaultZone: http://admin:root@eureka:7001/eureka,http://admin:root@eureka2:7002/eureka,http://admin:root@eureka3:7003/eurekainstance:instance-id: myspringcloud-provider-product3prefer-ip-address: truelease-renewal-interval-in-seconds: 2 # 设置心跳的时间间隔(默认是30秒)lease-expiration-duration-in-seconds: 5 # 如果现在超过了5秒的间隔(默认是90秒)info:app.name: myspringcloud-provider-product3company.name: enbuild.artifactId: $project.artifactId$build.modelVersion: $project.modelVersion$
CREATE DATABASE springcloud2 CHARACTER SET UTF8 ;
USE springcloud2;
CREATE TABLE product (productId BIGINT AUTO_INCREMENT ,productName VARCHAR(50) ,productDesc VARCHAR(50) ,CONSTRAINT pk_prodcut_id PRIMARY KEY(productId)
) ;INSERT INTO product(productName,productDesc) VALUES ('java编程',DATABASE()) ;
INSERT INTO product(productName,productDesc) VALUES ('C',DATABASE()) ;
INSERT INTO product(productName,productDesc) VALUES ('C++',DATABASE()) ;
INSERT INTO product(productName,productDesc) VALUES ('Springboot',DATABASE()) ;
INSERT INTO product(productName,productDesc) VALUES ('springcloud',DATABASE()) ;
CREATE DATABASE springcloud3 CHARACTER SET UTF8 ;
USE springcloud3;
CREATE TABLE product (productId BIGINT AUTO_INCREMENT ,productName VARCHAR(50) ,productDesc VARCHAR(50) ,CONSTRAINT pk_prodcut_id PRIMARY KEY(productId)
) ;INSERT INTO product(productName,productDesc) VALUES ('java编程',DATABASE()) ;
INSERT INTO product(productName,productDesc) VALUES ('C',DATABASE()) ;
INSERT INTO product(productName,productDesc) VALUES ('C++',DATABASE()) ;
INSERT INTO product(productName,productDesc) VALUES ('Springboot',DATABASE()) ;
INSERT INTO product(productName,productDesc) VALUES ('springcloud',DATABASE()) ;
1.7 启动服务,浏览器消费者服务多次调用接口,可以看到Ribbon负载均衡生效,默认轮询策略。
1.8 消费者服务配置类新增全局配置,负载均衡改为随机策略
@Beanpublic IRule ribbonRule() {return new com.netflix.loadbalancer.RandomRule();}
1.9 服务消费方获取服务提供方信息,修改ConsumerProductController.java
@Resource
private LoadBalancerClient loadBalancerClient;@RequestMapping("/product/getAllInfo")public Object listProduct() {ServiceInstance serviceInstance = this.loadBalancerClient.choose("MYSPRINGCLOUD-PROVIDER-PRODUCT") ;System.out.println("【*** ServiceInstance ***】host = " + serviceInstance.getHost()+ "、port = " + serviceInstance.getPort()+ "、serviceId = " + serviceInstance.getServiceId());return restTemplate.exchange(PRODUCT_LIST_URL,HttpMethod.GET,new HttpEntity<>(httpHeaders), List.class).getBody();}
2.集成Feign接口服务
2.1 复制myspringcloud-consumer 成一个新的模块myspringcloud-consumer-feign,修改POM
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2.2 新建立一个myspringcloud-service模块,专门定义客户端的调用接口,修改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"><parent><artifactId>myspringcloud</artifactId><groupId>com.en</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>myspringcloud-service</artifactId><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><dependency><groupId>com.en</groupId><artifactId>myspringcloud-api</artifactId></dependency></dependencies></project>
2.3 在myspringcloud-service新建com.en.config路径,新建FeignClientConfig配置类
package com.en.feign;
import feign.auth.BasicAuthRequestInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class FeignClientConfig {@Beanpublic BasicAuthRequestInterceptor getBasicAuthRequestInterceptor() {return new BasicAuthRequestInterceptor("admin", "root");}
}
2.4 myspringcloud-service 模块新建IProductClientService接口
package com.en.service;import com.en.feign.FeignClientConfig;
import com.en.po.ProductPo;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;import java.util.List;@FeignClient(name = "MYSPRINGCLOUD-PROVIDER-PRODUCT",configuration = FeignClientConfig.class)
public interface IProductClientService {@RequestMapping("/prodcut/getInfoById/{id}")ProductPo getProduct(@PathVariable("id")long id);@RequestMapping("/prodcut/getAllInfo")List<ProductPo> listProduct() ;@RequestMapping("/prodcut/addInfo")boolean addPorduct(ProductPo productPo) ;}
2.5 myspringcloud-consumer-feign 修改pom文件,引入myspringcloud-service 依赖
<dependency><groupId>com.en</groupId><artifactId>myspringcloud-service</artifactId><version>1.0-SNAPSHOT</version><scope>compile</scope>
</dependency>
2.6 myspringcloud-consumer-feign模块删除RestConfig配置类,并修改ConsumerProductController
package com.en.controller;import com.en.po.ProductPo;
import com.en.service.IProductClientService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/*** @ClassName ConsumerProductController* @Description 服务消费方控制器* @Author liuxiaobai* @Date 2020年6月26日09:18:41* @Version 1.0**/
@RestController
@RequestMapping("/consumer")
public class ConsumerProductController {@Resourceprivate IProductClientService iProductClientService;@RequestMapping("/product/getInfoById")public Object getProduct(long id) {return iProductClientService.getProduct(id);}@RequestMapping("/product/getAllInfo")public Object listProduct() {return iProductClientService.listProduct();}@RequestMapping("/product/addInfo")public Object addPorduct(ProductPo productPo) {return iProductClientService.addPorduct(productPo);}
}
2.7 myspringcloud-consumer-feign模块修改程序启动类,新增@EnableFeignClients注解
package com.en;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.openfeign.EnableFeignClients;@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients("com.en.service")
public class ConsumerApplicationFeign {public static void main(String[] args) {SpringApplication.run(ConsumerApplicationFeign.class,args);}
}
2.8 启动服务测试接口调用正常,并自带负载均衡
源码自取:
github地址:https://github.com/L1021204735/myspringcloud3