使用Spring Could 实现负载均衡

来源:互联网 发布:最小的c语言软件 编辑:程序博客网 时间:2024/06/06 18:24

场景:


在以上场景中 客户端请求一个之后,后面的服务需要能够负载均衡,本次采用Spring Could实现上述模型涉及到的 组件有 Eurekaserver(注册中心)

Ribbon(负载均衡器)

其中

Eurekaserver用于服务端以及负载均衡器的注册,也就是保存了这些服务者的地址信息

Ribbon 用于实现特定的负载均衡策略   注意点:提供同一个服务的不同服务提供者的服务名需要相同

代码实例:

a.首先创建Eurekaserver注册中心

1.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>    <groupId>com.test</groupId>    <artifactId>could</artifactId>    <version>1.0-SNAPSHOT</version>    <parent>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-parent</artifactId>        <version>1.5.8.RELEASE</version>        <relativePath/> <!-- lookup parent from repository -->    </parent>    <properties>        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>        <java.version>1.8</java.version>    </properties>    <dependencies>        <!--eureka server -->        <dependency>            <groupId>org.springframework.cloud</groupId>            <artifactId>spring-cloud-starter-eureka-server</artifactId>        </dependency>        <!-- spring boot test-->        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-test</artifactId>            <scope>test</scope>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-autoconfigure</artifactId>        </dependency>    </dependencies>    <dependencyManagement>        <dependencies>            <dependency>                <groupId>org.springframework.cloud</groupId>                <artifactId>spring-cloud-dependencies</artifactId>                <version>Dalston.RC1</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>   <repositories>        <repository>            <id>spring-milestones</id>            <name>Spring Milestones</name>            <url>https://repo.spring.io/milestone</url>            <snapshots>                <enabled>false</enabled>            </snapshots>        </repository>    </repositories></project>
2.创建主程序

@EnableEurekaServer@SpringBootApplicationpublic class EurekaserverApplication {    public static void main(String[] args) {        new SpringApplicationBuilder(EurekaserverApplication.class).web(true).run(args);    }}
3.配置文件application.properties

spring.application.name=eureka-serverserver.port=10001#强制不注册到注册服务器eureka.client.register-with-eureka=falseeureka.client.fetch-registry=false#注册中心地址eureka.client.serviceUrl.defaultZone=http://localhost:${server.port}/eureka/#驱逐下线的服务,间隔,5秒,默认是60,建议开发和测试环境配置#org.springframework.cloud.netflix.eureka.server.EurekaServerConfigBean.evictionIntervalTimerInMseureka.server.evictionIntervalTimerInMs=5000
4.启动,访问如下地址可看到注册中心的注册信息

127.0.0.1:10001   

由于现在还没有服务注册,因而无法看到有什么注册服务的提供者信息


b.编写服务提供者  由于我们需要做负载均衡因为,服务提供者需要打成jar包,在不同的端口号上运行多个,这里只运行两个服务提供者

1.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>    <groupId>com.test</groupId>    <artifactId>service</artifactId>    <version>1.0-SNAPSHOT</version>    <parent>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-parent</artifactId>        <version>1.5.8.RELEASE</version>        <relativePath/> <!-- lookup parent from repository -->    </parent>    <dependencies>        <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-eureka</artifactId>        </dependency>    </dependencies>    <dependencyManagement>        <dependencies>            <dependency>                <groupId>org.springframework.cloud</groupId>                <artifactId>spring-cloud-dependencies</artifactId>                <version>Brixton.RELEASE</version>                <type>pom</type>                <scope>import</scope>            </dependency>        </dependencies>    </dependencyManagement></project>
2.编写主程序

@EnableDiscoveryClient@SpringBootApplicationpublic class ComputeServiceApplication {    public static void main(String[] args) {        new SpringApplicationBuilder(ComputeServiceApplication.class).web(true).run(args);    }}

3.编写提供服务的controller

@RestControllerpublic class ComputeController {    private final Logger logger = Logger.getLogger(getClass());    @Autowired    private DiscoveryClient client;    @RequestMapping(value = "/add" ,method = RequestMethod.GET)    public String add(@RequestParam Integer a, @RequestParam Integer b) {        ServiceInstance instance = client.getLocalServiceInstance();        Integer r = a + b;        logger.info("/add, host:" + instance.getHost() + ", service_id:" + instance.getServiceId() + ", result:" + r);        return "service0:"+r;    }}
4.配置文件application.properties

spring.application.name=compute-serviceserver.port=2222eureka.client.serviceUrl.defaultZone=http://localhost:10001/eureka/


b2 :

 1.服务提供者2  为了区分 将返回值修改的不同,如下:

return "service1:"+r

2.配置文件

spring.application.name=compute-serviceserver.port=2223eureka.client.serviceUrl.defaultZone=http://localhost:10001/eureka/

注意点就是服务名一样,


c.编写负载均衡服务

1.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>    <groupId>com.test</groupId>    <artifactId>couldRibbon</artifactId>    <version>1.0-SNAPSHOT</version>    <parent>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-parent</artifactId>        <version>1.4.3.RELEASE</version>        <relativePath/> <!-- lookup parent from repository -->    </parent>    <dependencies>        <dependency>            <groupId>org.springframework.cloud</groupId>            <artifactId>spring-cloud-starter-ribbon</artifactId>        </dependency>        <dependency>            <groupId>org.springframework.cloud</groupId>            <artifactId>spring-cloud-starter-eureka</artifactId>        </dependency>        <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>    </dependencies>    <dependencyManagement>        <dependencies>            <dependency>                <groupId>org.springframework.cloud</groupId>                <artifactId>spring-cloud-dependencies</artifactId>                <version>Brixton.RELEASE</version>                <type>pom</type>                <scope>import</scope>            </dependency>        </dependencies>    </dependencyManagement></project>

2.编写主程序

@SpringBootApplication@EnableDiscoveryClientpublic class RibbonApplication {    @Bean    @LoadBalanced    RestTemplate restTemplate(){        return new RestTemplate();    }    public static void main(String[] args) {        SpringApplication.run(RibbonApplication.class,args);    }}

3.编写对外暴露的服务提供接口

@RestController@RequestMapping("/h1")public class ConsumerController {    @Autowired    RestTemplate restTemplate;    @RequestMapping("/keys")    public @ResponseBody    Object getKeyValue(@RequestParam int a, @RequestParam int b) {        return restTemplate.getForEntity("http://COMPUTE-SERVICE/add?a=" + a + "&b=" + b, String.class).getBody();    }}

4.编写配置文件application.properties

spring.application.name=ribbon-consumerserver.port=8003eureka.client.serviceUrl.defaultZone=http://localhost:10001/eureka/

这样我们就完成了上述的场景编码

启动服务

首先需要启动注册中,在启动服务,在启动负载均衡服务,通过postman工具进行访问

127.0.0.1:8003/h1/keys?a=1&b=2

可以看到负载均衡的效果。













阅读全文
0 0
原创粉丝点击