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。
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 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提供的服务了。