你好!开始前, 先叨叨下,感觉必须写下环境 ,免得同学们在学习过程中,遇到和我一样的坑(像小猪乔治一样踩了很多水坑,浪费了很多宝贵时间),看前人的文章和案例,自己再写代码的时候,总是这样那样的问题,好多原因都是环境的问题,特别是依赖包新版本不向后兼容的问题,比如springboot版本。如下:
IDEA2019.2、JDK1.8.0_151、springboot2.1.7.RELEASE、springcloudGreenwich.SR2
当然吃水不忘挖井人,之前学习了springboot+springcloud基础微服务架构,在它基础上完成的这篇文章,感谢。
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,可以看到还没有服务注册。
可以看到选择了两个组件依赖,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,可以看到页面上的输出结果
访问http://localhost:1111/,可以看到服务注册页面上有service-order服务
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值随意,能够看到:
访问http://localhost:5555/service-order/order,不带code参数,则看到是空白页面
编辑项目的运行配置
复制order模块配置,增加覆盖参数server.port=2224,其他不动,保存。
运行这个配置,相当于又启动了一个服务,只是端口号变了。
访问http://localhost:1111/,可以看到服务注册页面增加了一个订单服务,端口号是2224。
serverid因为没有覆盖,所以也没有变,还是serveice-order。
相当于运行了两个订单服务。
多访问几次http://localhost:5555/service-order/order?code=t,能够看到这两个服务实例都能提供服务。
代码地址:https://github.com/hexiekuaile/weifuwu.git
打开后,画面如下,模块多了三个,有这篇文章的内容springboot+springcloud基础微服务架构,两篇文章都看看,对入门还是有帮助的。
写的不好,承让!