微服务单体架构eureka+feign+hystrix+zuul+ribbon

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值