1.为什么需要注册中心?
可以自动管理调用链,不要我们一个个写
比如A-B-C-D-E //A调用B服务,B调用C服务…
F-C//F调用C服务
如果是我们自己编写调用链,则代码
public void A(){B()};
public void B(){C()};
public void C(){D()};
public void D(){E()};
public void F(){C()};
//一旦调用链更长,程序员就很难从代码里找出哪个服务调用哪个服务,**一旦有某个服务调用关系发生变化比如D服务调用C服务,那么调用链就得变成重新修改,不只是把C和D位置调换那么简单,还要考虑到上游B服务怎么改、F服务怎么改,下游E服务怎么修改?**实际开发中调用链很长的,把要改动服务邻近上下游服务统统都得改一遍得多费时间.
有了注册中心后,这些就简单了,注册中心会自动帮我们理清调用关系,看下文链接图片
https://www.geekdigging.com/2019/08/31/2114219821/
2.Eureka
Eureka实现服务注册和发现. Eureka分为客户端和服务端
服务端:把服务列表管理展示出来
客户端:分为service provider、service consumer
service provider:把服务注册到服务端
service consumer:获取服务列表
3.创建springcloud项目(推荐,在idea创建老是失败)
(1)打开网址:https://start.spring.io/
红色圈住地方按照我的填即可,其他的比如group这些任意填即可
(2)最后点击最下方Generate the project下载导入项目即可
发现pom.xml第一行报红,添加<maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
修改如下:
<properties>
<java.version>16</java.version>
<spring-cloud.version>2020.0.3</spring-cloud.version>
<maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
</properties>
(3)启动项目,然后浏览器输入http://localhost:8761/
注意不是输入网址http://localhost:8761/eureka/
4.集群环境注册中心
配置两个注册中心,修改defaultZone如下
选中项目右键run as ->run configurations->Arguments->–server.port=8781
然而输入http://localhost:8781/
还是访问不到eureka??
(5)去掉集群,修改application.yml如下
5.Service Provider
(1)创建项目producer,解压导入到开发工具eclipse中
(2)pom.xml相对上面的增加一个依赖包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
(3)主方法添加注解@EnableEurekaClient
application.yml修改如下
(4)先运行eureka项目再运行producer项目,说明服务已经注册了
6.consumers
(1)创建项目consumers,导入
(2)pom.xml相对producer的多了依赖包
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
(2)application.yml修改如下(其实就是把port,name的值修改)
(3)启动类方法加入注解@EnableEurekaClient
@EnableFeignClients报错
EnableFeignClients cannot be resolved to a type
解决方法:修改springboot和springcloud版本如下
<properties>
<java.version>16</java.version>
<spring-cloud.version>Edgware.SR4</spring-cloud.version>
<maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.13.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
(4)创建远程调用接口 HelloRemote
package com.springcloud.consumers;
import org.springframework.cloud.netflix.feign.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);
}
(5)创建控制器处理请求HelloController
package com.springcloud.consumers;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@Autowired
HelloRemote helloRemote;
@RequestMapping("/hello/{name}")
public String index(@PathVariable("name") String name) {
return helloRemote.hello(name);
}
}
(6)按照顺序运行Eureka、producer、consumers项目
注意:8084是producer端口
7.负载均衡(创建多个provider)
(1)复制consumer重命名consumer2,修改consumer2的application.yml端口为8088
(2) 修改consumer2的hellocontroller
(3)修改consumer2的pom.xml
(4)输入http://localhost:8085/hello/spring
http://localhost:8088/hello?name=springcloud
http://localhost:8084/hello?name=springcloud
http://localhost:8761/
8085:consumer端口,每次刷新返回结果和上次不同
8088 8084:producer端口
8761:Eureka端口
8.用法总结:
(1)观察发现producer、consumer的application.yml除了port、name不同其他一样
(2)consumers启动类比producer多了一个注解@EnableFeignClients
(3)consumerString hello(@RequestParam(value = "name") String name);
必须和producer里的public String hello(@RequestParam String name) { return "hello "+name+",producer is ready"; }
方法名参数一致