springboot2微服务入门案例、多图傻瓜式

springboot2微服务入门案例、多图傻瓜式

    • 环境
    • 一. 建maven项目
    • 二、用spring Initialize建eureka注册服务模块
    • 三、用spring Initialize建订单order服务模块
    • 四、用spring Initialize建zuul微服务网关路由模块
    • 五、 通过zuul路由网关实现负载均衡
    • 六、 下载代码运行

环境

你好!开始前, 先叨叨下,感觉必须写下环境 ,免得同学们在学习过程中,遇到和我一样的坑(像小猪乔治一样踩了很多水坑,浪费了很多宝贵时间),看前人的文章和案例,自己再写代码的时候,总是这样那样的问题,好多原因都是环境的问题,特别是依赖包新版本不向后兼容的问题,比如springboot版本。如下:
IDEA2019.2、JDK1.8.0_151、springboot2.1.7.RELEASE、springcloudGreenwich.SR2

当然吃水不忘挖井人,之前学习了springboot+springcloud基础微服务架构,在它基础上完成的这篇文章,感谢。

一. 建maven项目

springboot2微服务入门案例、多图傻瓜式_第1张图片springboot2微服务入门案例、多图傻瓜式_第2张图片

二、用spring Initialize建eureka注册服务模块

springboot2微服务入门案例、多图傻瓜式_第3张图片springboot2微服务入门案例、多图傻瓜式_第4张图片springboot2微服务入门案例、多图傻瓜式_第5张图片pom代码不用动,如下:



    4.0.0
    
        org.springframework.boot
        spring-boot-starter-parent
        2.1.7.RELEASE
         
    
    com.yw
    eureka
    1.0-SNAPSHOT
    eureka
    Demo project for Spring Boot

    
        1.8
        Greenwich.SR2
    

    
        
            org.springframework.cloud
            spring-cloud-starter-netflix-eureka-server
        

        
            org.springframework.boot
            spring-boot-starter-test
            test
        
    

    
        
            
                org.springframework.cloud
                spring-cloud-dependencies
                ${spring-cloud.version}
                pom
                import
            
        
    

    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
            
        
    


主程序仅增加@EnableEurekaServer,如下

package com.yw.eureka;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaApplication.class, args);
    }
}

resources目录下的application.properties改为application.yml,当然不改也成,只为追随流行。内容增加如下:

server:
  port: 1111
eureka:
  client:
    register-with-eureka: false
    fetch-registry: false
    serviceUrl:
      defaultZone: http://localhost:1111/eureka/

这个时候,可以运行,访问http://localhost:1111,可以看到还没有服务注册。
springboot2微服务入门案例、多图傻瓜式_第6张图片

三、用spring Initialize建订单order服务模块

springboot2微服务入门案例、多图傻瓜式_第7张图片springboot2微服务入门案例、多图傻瓜式_第8张图片springboot2微服务入门案例、多图傻瓜式_第9张图片可以看到选择了两个组件依赖,springweb、discovery client,pom不用动,部分xml如下:

 
        
            org.springframework.boot
            spring-boot-starter-web
        
        
            org.springframework.cloud
            spring-cloud-starter-netflix-eureka-client
        

        
            org.springframework.boot
            spring-boot-starter-test
            test
        
    

主程序代码增加@EnableDiscoveryClient,如下,

package com.yw.order;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@EnableDiscoveryClient
@SpringBootApplication
public class OrderApplication {
    public static void main(String[] args) {
        SpringApplication.run(Order2Application.class, args);
    }
}

新建控制器,代码如下:

package com.yw.order;

import org.jboss.logging.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.cloud.client.serviceregistry.Registration;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
public class OrderController {
    private final Logger logger = Logger.getLogger(getClass());
    @Qualifier("eurekaRegistration")
    @Autowired
    private Registration registration;  // 服务注册

    @Autowired
    private DiscoveryClient client; // 服务发现客户端

    @Value("${server.port}")
    String port;    //通过这种方式也能获取注册服务的信息
    @Value("${spring.application.name}")
    String serverid;

    @RequestMapping(value = "/order")
    public String order() {
    	//两种方式获取订单服务实例的信息
        logger.info("==" + registration.getInstanceId());//registration可以获取注册服务的信息
        logger.info("==被调用了,port:"+port+",serverid: "+serverid);
        return "这是订单2服务 ,port:"+port+",serverid: "+serverid;
    }
}

resources目录下的application.properties代码如下:

spring.application.name: service-order
server.port: 2223
eureka.client.serviceUrl.defaultZone: http://localhost:1111/eureka/

如你所见,文件名后缀没有改成yml,哈哈。
启动order服务,访问http://localhost:2223/order,可以看到页面上的输出结果
springboot2微服务入门案例、多图傻瓜式_第10张图片
访问http://localhost:1111/,可以看到服务注册页面上有service-order服务
springboot2微服务入门案例、多图傻瓜式_第11张图片

四、用spring Initialize建zuul微服务网关路由模块

springboot2微服务入门案例、多图傻瓜式_第12张图片pom代码不用修改,部分代码如下:


            org.springframework.cloud
            spring-cloud-starter-netflix-eureka-client
        
        
            org.springframework.cloud
            spring-cloud-starter-netflix-zuul
        

        
            org.springframework.boot
            spring-boot-starter-test
            test
        
    

主程序代码修改如下:

package com.yw.zuul;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
@EnableZuulProxy
public class ZuulApplication {
    public static void main(String[] args) {
        SpringApplication.run(ZuulApplication.class, args);
    }

    @Bean
    public ZuulFilterTest zuulFilterTest() {
        return new ZuulFilterTest();
    }
}

访问过滤,仅演示了判断访问url是否带code参数,代码如下:

package com.yw.zuul;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import org.jboss.logging.Logger;
import javax.servlet.http.HttpServletRequest;

public class ZuulFilterTest extends ZuulFilter {
    private final org.jboss.logging.Logger log = Logger.getLogger(getClass());

    @Override
    public Object run() {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();

        String code = request.getParameter("code");
        if (code == null) {
            log.warn("==code is empty");
            ctx.setSendZuulResponse(false);
            ctx.setResponseStatusCode(401);
            return null;
        }
        log.info("==code is ok");
        return null;
    }

    @Override
    public boolean shouldFilter() {
        return true;
    }

    @Override
    public int filterOrder() {
        return 0;
    }

    @Override
    public String filterType() {
        return "pre";
    }
}

application.yml代码如下:

server:
    port: 5555
spring:
    application:
        name: gateway-zuul
eureka:
    client:
        serviceUrl:
            defaultZone: http://localhost:1111/eureka/
zuul:
    routes:
        orders:
            path: /service-order/**
            serviceId: service-order       

启动zuul模块,访问http://localhost:1111/,可以看到服务注册页面上有gateway-zuul服务。
访问http://localhost:5555/service-order/order?code=t,code值随意,能够看到:
springboot2微服务入门案例、多图傻瓜式_第13张图片
访问http://localhost:5555/service-order/order,不带code参数,则看到是空白页面

五、 通过zuul路由网关实现负载均衡

编辑项目的运行配置
在这里插入图片描述
复制order模块配置,增加覆盖参数server.port=2224,其他不动,保存。
springboot2微服务入门案例、多图傻瓜式_第14张图片运行这个配置,相当于又启动了一个服务,只是端口号变了。
访问http://localhost:1111/,可以看到服务注册页面增加了一个订单服务,端口号是2224。
springboot2微服务入门案例、多图傻瓜式_第15张图片serverid因为没有覆盖,所以也没有变,还是serveice-order。
相当于运行了两个订单服务。
多访问几次http://localhost:5555/service-order/order?code=t,能够看到这两个服务实例都能提供服务。
在这里插入图片描述
在这里插入图片描述

六、 下载代码运行

代码地址:https://github.com/hexiekuaile/weifuwu.git
打开后,画面如下,模块多了三个,有这篇文章的内容springboot+springcloud基础微服务架构,两篇文章都看看,对入门还是有帮助的。
springboot2微服务入门案例、多图傻瓜式_第16张图片写的不好,承让!

你可能感兴趣的:(微服务)