SpringCloud负载均衡服务
Posted 一点点
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringCloud负载均衡服务相关的知识,希望对你有一定的参考价值。
SpringCloud负载均衡服务配置之一《配置中心》
Eureka配置中心
创建一个项目pom.xml文件如下:
<?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> <groupId>top.xzhand.junecloud</groupId> <artifactId>junecloud</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> <modules> <module>eureka</module> <module>admin</module> <module>common</module> <module>admin-product</module> <module>web</module> <module>admin-product1</module> </modules> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <!--SpringCloud版本控制--> <spring-cloud.version>Finchley.RELEASE</spring-cloud.version> </properties> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.3.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <dependencies> <!--springcloud使用rest+ribbon实现服务调用和服务提供者的负载均衡依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-netflix-core</artifactId> <version>2.0.1.RELEASE</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-ribbon</artifactId> <version>1.3.4.RELEASE</version> </dependency> <!--springcloud使用rest+ribbon实现服务调用和服务提供者的负载均衡依赖--> <!--使用feign的方式进行服务调依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> <version>1.4.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-openfeign-core</artifactId> <version>2.0.1.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> <version>1.4.4.RELEASE</version> </dependency> <!--使用feign的方式进行服务调依赖--> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.32</version> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
创建一个module模块eureka
pom.xml
<?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>junecloud</artifactId> <groupId>top.xzhand.junecloud</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>eureka</artifactId> </project>
配置启动项
添加@EnableEurekaServer 标识注册中心项目
package top.xzhand.cloud.eureka; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; @SpringBootApplication @EnableEurekaServer public class EurekaServerApplication { public static void main(String[] args) { SpringApplication.run(EurekaServerApplication.class, args); } }
配置文件设置
application.yml
server: port: 8090 eureka: instance: hostname: localhost client: register-with-eureka: false fetch-registry: false service-url: defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ spring: application:
SpringCloud负载均衡服务配置之二《服务提供者》
创建公用module模块
pom.xml
<?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>junecloud</artifactId> <groupId>top.xzhand.junecloud</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>common</artifactId> <dependencies> <!--springboot相关jar--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!--swagger2接口文档--> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.8.0</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.8.0</version> </dependency> <dependency> <groupId>com.mangofactory</groupId> <artifactId>swagger-springmvc</artifactId> <version>1.0.2</version> </dependency> <dependency> <groupId>com.mangofactory</groupId> <artifactId>swagger-models</artifactId> <version>1.0.2</version> </dependency> <dependency> <groupId>com.wordnik</groupId> <artifactId>swagger-annotations</artifactId> <version>1.3.11</version> </dependency> <!--swagger2接口文档--> <!-- lombok--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.6</version> </dependency> <!--阿波罗配置中心--> <dependency> <groupId>com.ctrip.framework.apollo</groupId> <artifactId>apollo-client</artifactId> <version>1.4.0</version> </dependency> <!--阿波罗配置中心--> <!--redis引入--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> </dependency> <!--redis引入--> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> <version>2.4.2</version> </dependency> <!--高版本的springBoot,在新版本中springBoot的@configurationProperties注解去掉了localhost属性@ConfigurationProperties(prefix="") 没有指定 classpath 时,IDEA 提示没有找到 classpath。--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> <!-- httpcomponents --> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.2</version> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpcore</artifactId> <version>4.4.4</version> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpmime</artifactId> <version>4.5.2</version> </dependency> <dependency> <groupId>commons-net</groupId> <artifactId>commons-net</artifactId> <version>3.6</version> </dependency> </dependencies> </project>
创建服务提供者module
pom.xml
<?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>junecloud</artifactId> <groupId>top.xzhand.junecloud</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>admin-product</artifactId> <properties> <junecloud-common.version>1.0-SNAPSHOT</junecloud-common.version> </properties> <dependencies> <dependency> <groupId>top.xzhand.junecloud</groupId> <artifactId>common</artifactId> <version>${junecloud-common.version}</version> </dependency> <!-- alibaba的druid数据库连接池 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.0</version> </dependency> <!-- Druid数据库连接池组件 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> <plugin> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-maven-plugin</artifactId> <version>1.3.2</version> <configuration> <verbose>true</verbose> <overwrite>true</overwrite> </configuration> <dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.22</version> </dependency> </dependencies> </plugin> </plugins> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.yml</include> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.yml</include> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> </resources> </build> </project>
启动项创建
@EnableDiscoveryClient 连接配置中心注解
package top.xzhand.cloud.admin.product; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; /** * 负载均衡服务提供者 */ @SpringBootApplication @EnableDiscoveryClient public class ProductServerApplication { public static void main(String[] args) { SpringApplication.run(ProductServerApplication.class, args); } }
数据库配置
package top.xzhand.cloud.admin.product.config; import com.alibaba.druid.pool.DruidDataSource; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import javax.sql.DataSource; @Configuration public class Druidconfig { @Bean @ConfigurationProperties(prefix="spring.datasource") public DataSource druidDataSource() { DruidDataSource druidDataSource = new DruidDataSource(); return druidDataSource; } }
服务提供者应用创建
package top.xzhand.cloud.admin.product.controller; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController public class HelloController { /** * feign的方式进行服务调 * @param name * @return */ @RequestMapping("/hello") public String index(@RequestParam String name) { return "这是服务提供者,参数:"+name; } /** * 使用rest+ribbon * @param name * @return */ @RequestMapping("/hellorest") public String hellorest(@RequestBody String name) { return "这是服务提供者,参数:"+name; } }
配置文件
application.yml
spring: application: name: spring-cloud-producer datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/june?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false username: root password: root123 type: com.alibaba.druid.pool.DruidDataSource druid: #最大活跃数 maxActive: 20 #初始化数量 initialSize: 1 #最大连接等待超时时间 maxWait: 60000 #打开PSCache,并且指定每个连接PSCache的大小 poolPreparedStatements: true maxPoolPreparedStatementPerConnectionSize: 20 #通过connectionProperties属性来打开mergeSql功能;慢SQL记录 #connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 minIdle: 1 timeBetweenEvictionRunsMillis: 60000 minEvictableIdleTimeMillis: 300000 validationQuery: select 1 from dual testWhileIdle: true testOnBorrow: false testOnReturn: false #配置监控统计拦截的filters,去掉后监控界面sql将无法统计,‘wall‘用于防火墙 filters: stat, wall, log4j #mybatis mybatis: # 数据库映射实体类包路径 type-aliases-package: top.xzhand.po # 指定mybatis的xml文件路径 mapper-locations: classpath*:top/xzhand/mapper/impl/*.xml # 表中的字段名与对象的属性名下划线和驼峰转换 configuration: map-underscore-to-camel-case: true # mapper-locations: classpath:/mybatis/*.xml server: port: 8091 eureka: instance: hostname: localhost client: service-url: defaultZone: http://${eureka.instance.hostname}:8090/eureka/
重复上面操作,创建第二个服务提供者。。。。。。。。
SpringCloud负载均衡服务配置之三《消费者》
创建消费者模块 ribbon调用方式
pom.xml
<?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>junecloud</artifactId> <groupId>top.xzhand.junecloud</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>web</artifactId> <properties> <junecloud-common.version>1.0-SNAPSHOT</junecloud-common.version> </properties> <dependencies> <dependency> <groupId>top.xzhand.junecloud</groupId> <artifactId>common</artifactId> <version>${junecloud-common.version}</version> </dependency> </dependencies> </project>
服务启动项
package top.xzhand.cloud.web; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; /** * 使用rest+ribbon实现服务调用和服务提供者的负载均衡 */ @SpringBootApplication @EnableDiscoveryClient public class WebServerApplication { public static void main(String[] args) { SpringApplication.run(WebServerApplication.class, args); } }
ribbon负载均衡配置项
package top.xzhand.cloud.web.config; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.converter.StringHttpMessageConverter; import org.springframework.web.client.RestTemplate; import java.nio.charset.StandardCharsets; /** * 实现负载均衡 */ @Configuration public class RestTemplateConfig { @Bean @LoadBalanced//追加ribbon负载功能 public RestTemplate restTemplate(){ RestTemplate restTemplate= new RestTemplate(); //解决调用乱码问题 restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8)); return restTemplate; } }
消费者应用
package top.xzhand.cloud.web.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; @RestController public class HelloController { @Autowired private RestTemplate restTemplate; @PostMapping("/hello") public String hello(String name){ System.out.println(name); String url = "http://spring-cloud-producer/hellorest"; String r = restTemplate.postForObject(url, name,String.class); return r; } }
配置文件
application.yml
spring: application: name: spring-cloud-consumer server: port: 8093 eureka: instance: hostname: localhost client: service-url: defaultZone: http://${eureka.instance.hostname}:8090/eureka/
创建消费者模块 feign的方式进行服务调
pom.xml
<?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>junecloud</artifactId> <groupId>top.xzhand.junecloud</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>web</artifactId> <properties> <junecloud-common.version>1.0-SNAPSHOT</junecloud-common.version> </properties> <dependencies> <dependency> <groupId>top.xzhand.junecloud</groupId> <artifactId>common</artifactId> <version>${junecloud-common.version}</version> </dependency> </dependencies> </project>
启动项
@EnableFeignClients feign的方式进行服务调必须加上
package top.xzhand.cloud.admin; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.openfeign.EnableFeignClients; /** * 使用feign的方式进行服务调 */ @SpringBootApplication @EnableDiscoveryClient @EnableFeignClients public class AdminServerApplication { public static void main(String[] args) { SpringApplication.run(AdminServerApplication.class, args); } }
feign的方式配置项
package top.xzhand.cloud.admin.remote; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; @FeignClient(name= "spring-cloud-producer") public interface HelloRemote { @RequestMapping(value = "/hello") String hello(@RequestParam(value = "name") String name); }
消费应用
package top.xzhand.cloud.admin.controller; import com.alibaba.fastjson.JSON; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; import top.xzhand.cloud.admin.remote.HelloRemote; @RestController public class HelloController { @Autowired private HelloRemote helloRemote; @RequestMapping("/hello/{name}") public String index(@PathVariable("name") String name) { return helloRemote.hello(name); } }
配置文件
application.yml
spring: application: name: spring-cloud-consumer server: port: 8092 eureka: instance: hostname: localhost client: service-url: defaultZone: http://${eureka.instance.hostname}:8090/eureka/
以上是关于SpringCloud负载均衡服务的主要内容,如果未能解决你的问题,请参考以下文章
3.SpringCloud -- 服务调用负载均衡 RibbonOpenFeign
springCloud搭建微服务集群+Zuul服务器端负载均衡
#yyds干货盘点# springcloud整合feign实现服务负载均衡,断路器