SpringCloud+Eureka实现简单的微服务+负载均衡的案例

一、SpringCloud简述

1、参考笔记:

SpringCloud教程合集:https://mp.weixin.qq.com/s/-nD8_UlEPfZwvijad6BNng

SpringCloud和Dubbo的区别:https://blog.csdn.net/anningzhu/article/details/76599875

 

SpringCloud与Dubbo就像品牌机与组装机的区别,前者已经被Spring Source整合得很好了,但是自由度不高;后者只实现了服务治理,其他的功能比如注册中心需要加入第三方模块ZooKeeper。

 

二、SpringCloud+Eureka案例

 

1、操作环境

IDEA+SpringCloud+Eureka

 

2、SpringCloud+Eureka

①先创建一个空白的Maven工程,命名为springcloud

 

②然后给这个工程添加SpringBoot的module,命名为eureka,勾选依赖如下:

 

③接下来,修改该module的启动类,如下,

加上注解:@EnableEurekaServer

 

再修改application.properties文件:

server.port=1111

spring.application.name=eureka

eureka.instance.hostname=localhost

 

#要不要把它注册到服务注册中心去?

# (默认是true,但是Eureka本身就是服务注册中心,所以需要改成false)

eureka.client.register-with-eureka=false

 

eureka.client.service-url.defaultZone=http://localhost:1111/eureka

根据上方的配置,启动Eureka之后,可以在浏览器访问http://localhost:1111/,打开Eureka控制台。

经过上面的操作,服务注册中心Eureka就配置好了。

 

3、接下来增加一个服务提供者provider

①再给springcloud这个工程新增module,module为SpringBoot项目,命名为provider

 

注意:这里勾选的是Eureka Discovery

 

②再配置provider的application.properties文件:

server.port=2000

spring.application.name=provider

 

#把该服务注册到注册中心去

eureka.client.service-url.defaultZone=http://localhost:1111/eureka

 

可见这个服务的默认端口是2000

 

③再新增一个HelloController,提供如下这样一个简单的服务:

package com.zzz.provider;

 

import org.springframework.beans.factory.annotation.Value;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.RestController;

 

@RestController

public class HelloController {

 

@Value("${server.port}")

Integer port;

 

@GetMapping("/hello")

public String hello(){

return "Hello Provider!"+port;

}

}

 

经过上面的配置,服务就算制作完成了。下面可以用Maven打包这个服务,就能同时在多个端口启动相同的服务。

 

打包完成显示Build Success之后,在Terminal中输入下面的命令,就可以在端口2001上启动服务:

 

启动这个2001端口的服务,我们再启动一个端口为2000的服务,这样在Eureka控制台就能看到2个不同端口的服务了。

 

4、最后再配置一个consumer,用来调用之前提供的服务,并实现负载均衡

①再给springcloud这个工程新增module,module为SpringBoot项目,命名为consumer

注意:这里勾选的是Eureka Discovery

 

②再配置provider的application.properties文件:

server.port=3000

spring.application.name=consumer

 

#把该消费者注册到注册中心去

eureka.client.service-url.defaultZone=http://localhost:1111/eureka

 

可见这个消费者的默认端口是3000

 

③接下来配置consumer的启动类,并配置负载均衡,然后新建HelloController来调用provider提供的服务

package com.zzz.consumer;

 

import com.netflix.loadbalancer.IRule;

import com.netflix.loadbalancer.RandomRule;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.cloud.client.loadbalancer.LoadBalanced;

import org.springframework.context.annotation.Bean;

import org.springframework.web.client.RestTemplate;

 

@SpringBootApplication

public class ConsumerApplication {

 

public static void main(String[] args) {

SpringApplication.run(ConsumerApplication.class, args);

}

 

@Bean

@LoadBalanced//使RestTemplate 具备负载均衡功能

public RestTemplate restTemplate(){

return new RestTemplate();

}

 

@Bean

IRule iRule(){

return new RandomRule();

}

}

 

package com.zzz.consumer;

 

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.cloud.client.ServiceInstance;

import org.springframework.cloud.client.discovery.DiscoveryClient;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.RestController;

import org.springframework.web.client.RestTemplate;

 

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.net.HttpURLConnection;

import java.net.URL;

import java.util.List;

 

@RestController

public class HelloController {

 

@Autowired

DiscoveryClient discoveryClient;//这个是寻找微服务的工具

 

int count=0;

 

//下面是手动实现负载均衡

@GetMapping("/hello")

public String hello() throws IOException {

//由于启动了2个provider实例,所以这个list里面就有2个jar

List list = discoveryClient.getInstances("provider");

ServiceInstance p =list.get(count++ % list.size());

String host=p.getHost();

int port=p.getPort();

URL url=new URL("http://"+host+":"+port+"/hello");

HttpURLConnection con=(HttpURLConnection) url.openConnection();

con.connect();

if (con.getResponseCode()==200){

BufferedReader br=new BufferedReader(new InputStreamReader(con.getInputStream()));

String s=br.readLine();

br.close();

return s;

}

return "请求失败!";

}

 

//下面这个是自动实现负载均衡

@Autowired

RestTemplate restTemplate;

@GetMapping("/hello2")

public String hello2(){

String s=null;

for (int i=0;i<10;i++) {

s=restTemplate.getForObject("http://provider/hello", String.class);

System.out.println(s);

}

return s;

}

 

 

}

 

配置好consumer之后,启动,就能在Eureka控制台看到所有启动的服务和消费者了。

http://localhost:1111/

 

然后,在浏览器打开http://localhost:3000/hello2和http://localhost:3000/hello,

就能通过消费者的端口,访问provider提供的服务了。

 

你可能感兴趣的:(SpringCloud)