eureka:服务与注册中心
feign:负载均衡(集成了ribbon,使用restFul风格实现服务间通信)
ribbon:负载均衡(restTemplate实现服务间通信,即rpc风格)
hystrix:服务熔断
zuul:服务网关
eureka使用:
服务端依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
服务端启动类注解:
@EnableEurekaServer // EurekaServer服务器端启动类,接受其它微服务注册进来
服务端配置文件:
eureka:
instance:
hostname: localhost #eureka服务端的实例名称,eureka7001.com为(C:\Windows\System32\drivers\etc\hosts)文件中修改的端口映射文件
client:
register-with-eureka: false #false表示不向注册中心注册自己。
fetch-registry: false #false表示自己就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
service-url:
defaultZone: http://localhost :服务端口号/eureka/ #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址(单机)。
客户端依赖:
<!-- actuator监控信息完善 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- 将微服务provider侧注册进eureka -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
客户端注解:
@EnableEurekaClient //本服务启动后会自动注册进eureka服务中
@EnableDiscoveryClient //服务发现
客户端配置文件:
eureka:
client: #客户端注册进eureka服务列表内
service-url:
defaultZone: http://localhost:7001/eureka
instance:
instance-id: microservicecloud-dept8001 #注册进eureka后的默认名称
prefer-ip-address: true #鼠标移到访问路径左下角可以显示IP地址
#点击eureka中的访问路径显示的信息
info:
app.name: 111
company.name: 222
build.artifactId: $project.artifactId$
build.version: $project.version$
上述info信息的展示依赖于父工程中pom.xml的
<build>
<finalName>microservicecloud</finalName>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<delimiters>
<delimit>$</delimit>
</delimiters>
</configuration>
</plugin>
</plugins>
</build>
负载均衡实现(ribbon和feign二选一)
ribbon实现
依赖:
<!-- Ribbon相关 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
启动类注解:
@EnableEurekaClient
//在启动该微服务的时候就能去加载我们的自定义Ribbon配置类,从而使配置生效
@RibbonClient(name="MICROSERVICECLOUD-DEPT")
name属性中为在eureka中注册的服务的名称
负载均衡规则可以进行如下配置类设置:
@Configuration
public class ConfigBean {
@Bean
@LoadBalanced//Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端 负载均衡的工具。
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
@Bean
public IRule myRule(){
return new RandomRule(); //作用:用我们重新选择的随机算法替代默认的轮询
//return new RoundRobinRule(); 轮询
}
}
ribbon配置信息只需识别eureka即可:
eureka:
client:
register-with-eureka: false #不将自己注册到eureka上面
service-url:
defaultZone: http://localhost:eureka端口号/eureka/
通过eureka中注册的服务名字寻找,使用RPC风格的restTemplate进行访问,实现代码如下
@RestController
public class DeptController_Consumer {
//private static final String REST_URL_PREFIX = "http://localhost:8001";
private static final String REST_URL_PREFIX = "http://MICROSERVICECLOUD-DEPT";
/**
* 使用 使用restTemplate访问restful接口非常的简单粗暴无脑。 (url, requestMap,
* ResponseBean.class)这三个参数分别代表 REST请求地址、请求参数、HTTP响应转换被转换成的对
象类型。
*/
@Autowired
private RestTemplate restTemplate;
@RequestMapping(value = "/consumer/dept/add")
public boolean add(Dept dept) {
return restTemplate.postForObject(REST_URL_PREFIX + "/dept/add", dept,
Boolean.class);
}
@RequestMapping(value = "/consumer/dept/get/{id}")
public Dept get(@PathVariable("id") Long id) {
return restTemplate.getForObject(REST_URL_PREFIX + "/dept/get/" + id,
Dept.class);
}
@RequestMapping(value = "/consumer/dept/list")
public List<Dept> list() {
return restTemplate.getForObject(REST_URL_PREFIX + "/dept/list", List.class);
}
}
feign实现
依赖:
<!--feign的相关依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
<!-- Ribbon相关 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
启动类注解:
@EnableEurekaClient
@EnableFeignClients(basePackages = {"com.example"})
@ComponentScan("com.example")
feign配置信息:
feign:
hystrix:
enabled: true #开启feign的hystrix支持,默认是false
eureka:
client:
register-with-eureka: false #不将自己注册到eureka上面
service-url:
defaultZone: http://localhost:eureka端口号/eureka/
负载均衡和服务熔断降级具体实现
@RestController
public class DeptController_Consumer
{
@Autowired
private DeptClientService service;
@RequestMapping(value = "/consumer/dept/get/{id}")
public Dept get(@PathVariable("id") Long id)
{
return this.service.get(id);
}
@RequestMapping(value = "/consumer/dept/list")
public List<Dept> list()
{
return this.service.list();
}
@RequestMapping(value = "/consumer/dept/add")
public Object add(Dept dept)
{
return this.service.add(dept);
}
}
@FeignClient(value = "MICROSERVICECLOUD-DEPT",fallbackFactory=DeptClientServiceFallbackFactory.class)
public interface DeptClientService
{
@RequestMapping(value = "/dept/get/{id}", method = RequestMethod.GET)
public Dept get(@PathVariable("id") long id);
@RequestMapping(value = "/dept/list", method = RequestMethod.GET)
public List<Dept> list();
@RequestMapping(value = "/dept/add", method = RequestMethod.POST)
public boolean add(Dept dept);
}
@Component // 不要忘记添加,不要忘记添加
public class DeptClientServiceFallbackFactory implements FallbackFactory<DeptClientService>
{
@Override
public DeptClientService create(Throwable throwable)
{
return new DeptClientService() {
@Override
public Dept get(long id)
{
return new Dept().setDeptno(id).setDname("该ID:" + id + "没有没有对应的信息,Consumer客户端提供的降级信息,此刻服务Provider已经关闭")
.setDb_source("no this database in MySQL");
}
@Override
public List<Dept> list()
{
return null;
}
@Override
public boolean add(Dept dept)
{
return false;
}
};
}
}
服务网关zuul
依赖:
<!-- zuul路由网关 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
启动类注解:
@EnableZuulProxy
zuul配置信息:
eureka:
client:
service-url:
defaultZone: http://localhost:eureka端口号/eureka
instance:
instance-id: localhost
prefer-ip-address: true
zuul:
#ignored-services: microservicecloud-dept
prefix: /example #配置公共前缀
ignored-services: "*" #忽略真实地址
routes:
mydept.serviceId: microservicecloud-dept
mydept.path: /mydept/** #将真是微服务名称伪装为此路径
#配置后的访问全路径为: http://localhost:zuul端口号/example/mydept/dept/get/4
#若不配置公共前缀和忽略真实地址则全路径为:
#http://localhost:zuul端口号/microservicecloud-dept/dept/get/4