引入:
作为springCloud的第二个核心技术,ribbon的作用是调用在注册中心注册好的服务,它又有两个使用方式,一是服务之间的调用会使用ribbon技术,二是前端的调用服务也会使用ribbon,接下来分别做解释。还有一个作用,ribbon它在调用服务的时候,会做负载均衡。
ribbon的调用逻辑:
ribbon要调用服务,就需要去服务中心获取记录服务信息的双层map。ribbon因为需要抓取map信息,所以它也需要去注册中心注册。
ribbon之服务调用服务:
1.首先在pom中引入依赖
<!--eureka-client依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<!--ribbon-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
2.在application文件中添加信息
server.port=8094
#给功能启一个服务名称 service-hi
spring.application.name=service-ribbon
#ip优先相互通信
eureka.instance.prefer-ip-address=true
#注册中心实现服务的注册
eureka.client.service-url.defaultZone=http://127.0.0.1:8761/eureka
3.在启动类中写一个写一个特殊的方法
@Bean
@LoadBalanced
public RestTemplate initRestTemplate(){
return new RestTemplate();
}
4.在需要调用其他服务的方法中写如下代码:
@Autowired
private RestTemplate template;
String url="http://test-user/user/update/point?money="+order.getOrderMoney();
Integer success=template.getForObject(url,Integer.class);
这里url中的test-user是一个注册在注册中心的服务,当使用这种跳转方式的时候,ribbon会拿着这个服务名test-user,去map中寻找对应的服务信息,这里ribbon还会做负载均衡,找到之后把这个服务的地址替换掉test-user,并且和后面的路径拼接,这样就可以去访问了。
ribbon之zuul的调用:
zuul是什么后面会说,这个调用后面也会细说,这里先暂时看一下。
所谓的zuul调用,就是zuul网关匹配url成功后,他会调用内部的ribbon去把注册的服务地址拼接到url上,实现服务的调用
引入:
zuul是一个网关,作用是整个微服务集群的唯一入口。
功能:
路由:根据nginx传递过来的不同请求地址,调用不同的微服务。
过滤(拦截): 网关中实现请求的鉴权工作(符不符合参数要求,是否携带身份信息,是否合法)
实现一个zuul网关:
1.在pom文件中加入注解:下面可以看出我们不止依赖了zuul,还依赖了eureka,这是因为一但路由成功后,将会启动zuul内部的ribbon来进行微服务访问,既然要使用ribbon就需要抓取注册中心的map,所以这里需要依赖eureka。
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>
</dependencies>
2.书写启动类:
@SpringBootApplication
@EnableEurekaClient
@EnableZuulProxy
public class StarterGateway {
public static void main(String[] args) {
SpringApplication.run(StarterGateway.class,args);
}
}
3.书写application配置文件(这里很重要):
server.port=8103
#给功能启一个服务名称 service-hi
spring.application.name=gate-way
#ip优先相互通信
eureka.instance.prefer-ip-address=true
#访问的注册中心接口,eureka-cliet会使用服务名称service-hi到
#注册中心实现服务的注册
eureka.client.service-url.defaultZone=http://127.0.0.1:8761/eureka
#test-user
zuul.routes.t-user.path=/zuul-tuser/**
zuul.routes.t-user.service-id=test-user
#test-order
zuul.routes.t-order.path=/zuul-torder/**
zuul.routes.t-order.service-id=test-order
上面的后面几行,就是网关的路由规则,zuul.routes是写死的,后面紧接的是自定义路由名称,最后的path是匹配规范,只有满足这个匹配规范的请求,才会去使用service-id中的微服务名称所对应的微服务地址去替换原来请求连接中的匹配规则,这样才可以访问到微服务(例如:/zuul-tuser/**表示只要请求到网关的uri地址是以/zuul-tuser/开始的就满足匹配)。
匹配规则:
?: 表示匹配一级单个字符,例如:path=/zuul-a/?,可以匹配到/zuul-a/a,/zuul-a/b,不能匹配/zuul-a/abc,/zuul-a/a/b/c
*: 表示匹配一级任意字符串,例如:path=/zuul-a/*,可以匹配到/zuul-a/a,/zuul-a/abc,不能匹配/zuul-a/a/b/c
**:表示匹配任意多级任意字符串,例如:path=/zuul-a/**,可以匹配到/zuul-a/a,/zuul-a/abc,/zuul-a/a/b/c.没有不能匹配的
整个微服务的项目结构:
解释:浏览器首先发送一个请求,这个请求会被nginx拦截,然后做地址匹配,如果匹配上了,就会调用nginx中写好的网关地址,在网关中如果新的地址满足网关的匹配规则,网关就就会把对应的服务地址拿去替换掉匹配规则,又生成了一个新的请求地址,这个地址就去访问微服务。
这里面可以看出,在nginx上可以做负载均衡,zuul网关在进行微服务调用也有负载均衡,微服务之间的调用同样也有负载均衡。
nginx中的地址书写:
可以分为下面三块,从左向右:第一块是书写网关的地址,第二块是书写网关的匹配规则地址,第三块是微服务中的requestMapping
调用过程的地址变化:
nginx:
server {
#配置www.ou.com 访问8091ou系统
listen 80;
server_name www.ou.com;
location /{
root easymall;
}
location =/user/query/point {
#通过访问网关
proxy_pass http://localhost:8103/zuul-tuser/user/query/point;
}
#积分更新
location =/user/update/point {
proxy_pass http://localhost:8103/zuul-tuser/user/update/point;
}
location =/order/pay {
proxy_pass http://localhost:8103/zuul-torder/order/pay;
}
}
zuul:
#test-user
zuul.routes.t-user.path=/zuul-tuser/**
zuul.routes.t-user.service-id=test-user
#test-order
zuul.routes.t-order.path=/zuul-torder/**
zuul.routes.t-order.service-id=test-order