-
Eureka注册服务中心
springCloud最常见的微服务注册是eureka,本篇主要讲述eurake注册,为了使springcloud版本统一,先创建一个maven空项目名为parent,作为公共包,只需要一个pom.xml文件
<modelVersion>4.0.0</modelVersion>
<groupId>com.springcloud</groupId>
<artifactId>parent</artifactId>
<version>1.0.1</version>
<packaging>pom</packaging>
<name>spring-cloud</name>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.14.RELEASE</version>
</parent>
<!-- 导入spring cloud依赖管理 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR4</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
还可以自己导入一些常用的公共包
再创建eureka注册项目,pom.xml文件配置引入
<!--引入公共包-->
<parent>
<groupId>com.springcloud</groupId>
<artifactId>parent</artifactId>
<version>1.0.1</version>
<relativePath/>
</parent>
<dependencies>
<!-- 配置注册中心 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
<!-- 添加用户验证 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
</dependencies>
application.properties配置如下:
#设置服务名称
spring.application.name=eureka-service
security.basic.enabled=true
#注册中心不需要注册自己
eureka.client.register-with-eureka=false
#注册中心不需要去发现服务
eureka.client.fetch-registry=false
#设置服务注册中心的URL
eureka.client.serviceUrl.defaultZone=http://${security.user.name}:${security.user.password}@localhost:9412/eureka
#设置访问服务中心URL的用户名
security.user.name=admin
#设置访问服务中心URL的密码
security.user.password=123456
#驱逐下线的服务,间隔,5秒,默认是60,建议开发和测试环境配置
eureka.server.evictionIntervalTimerInMs= 5000
# 请求连接的超时时间 默认的时间为 1 秒
ribbon.ConnectTimeout= 600000
# 请求处理的超时时间
ribbon.ReadTimeout= 600000
# 请求连接的超时时间
ego-product-provider.ribbon.ConnectTimeout= 600000
# 请求处理的超时时间
ego-product-provider.ribbon.ReadTimeout= 600000
服务注册中心可不设用户名和密码,但如果配置了用名和密码,客户端访问时就要配置用户名和密码。然后,使用@EnableEurakeServer注解开启服务注册,启动类代码如下:
//用来指定该项目为Eureka的服务注册中心
@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {
public static void main(String[] args) {
// TODO Auto-generated method stub
SpringApplication.run(EurekaApplication.class, args);
}
}
启动运行,浏览器输入http://localhost:9412/
因为设置了用户名和密码,这里会弹框提示。登录之后进入主界面
-
springcloud路由器管理服务
它主要目的是把各个微服务实际路径转为虚拟路径,我们在请求发送时只需要使用虚拟路径,application.properties配置如下:
server.port=9512
spring.application.name=zuul_service
security.user.name=admin
security.user.password=123456
#设置服务注册中心的URL,本服务要向该服务注册中心注册自己
eureka.client.serviceUrl.defaultZone=http://${security.user.name}:${security.user.password}@localhost:9412/eureka
#通过http方式转发(使用OKhttp)
ribbon.okhttp.enabled=true
#hystrix断路器默认响应时间
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds= 600000
#ribbon连接响应时间
ribbon.ConnectTimeout= 1000000
ribbon.ReadTimeout=1000000
#项目的服务名
zuul.routes.admin-route.serviceId=microservice
#项目的路径通配符
zuul.routes.admin-route.path=/admin/**
#就是把名为microservice项目/admin/**所有请求改为/admin2/**
zuul.routes.admin-route2.serviceId=microservice
zuul.routes.admin-route2.path=/admin2/**
#路由器服务响应时间
zuul.host.connect-timeout-millis=600000
zuul.host.socket-timeout-millis=600000
路由器部署启动类代码如下:
// 开启zuul的网关功能,他是一个组合注解,集成了eureka客户端注解。
@EnableZuulProxy
@SpringBootApplication
public class ZuulApplication {
public static void main(String[] args) {
SpringApplication.run(ZuulApplication.class, args);
}
}
运行之后,再次浏览器打开 http://localhost:9412
这个表示路由器服务已经开启
-
@FeignClient注解
当我们需要在消费者调用服务提供者时,使用@FeignClient注解,它自带负载均衡的功能,可以在controller层调用,也可以在service层调用,它的使用代码如下:
@FeignClient(name = "microservice-admin", fallback = DemoFallback.class,url="www.aaa.com",configuration=TestFeignConfiguration.class)
public interface IDemoFeignClient {
@PostMapping("/info")
public String info();
}
@Component
public class DemoFallback implements IDemoFeignClient {
@Override
public String info(){
return null;
}
}
name属性表示需要调用的服务名,也可以是value
fallback是返回类,一般是实现其接口的类,它表示当服务发生错误时,需要返回一个静态的值,以节省服务的开销,这种机制称为降级容错处理。
url:表示远程调用域名或ip地址,如果不是远程则不需要。
configuration:FeignClient调用需要的配置类,如远程调用需要加入一些请求头参数来获取token
@Configuration
public class TestFeignConfiguration implements RequestInterceptor {
@Override
public void apply(RequestTemplate template) {
HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
String token = request.getHeader("Authorization");
template.header("Content-Type", "application/json; charset=UTF-8");
template.header("Authorization", token);
}
}