【问题标题】:Feign Client from Jhipster UAA to microservice gateway app从 Jhipster UAA 到微服务网关应用的 Feign Client
【发布时间】:2018-01-19 21:21:35
【问题描述】:

我的网关(gw-app)应用程序中有一个联系人实体,我想在每次新用户在 UAA 应用程序中注册时创建一个条目。我一直在尝试将 Jhipster 文档中描述的 inter service communication 用于微服务。

  • 我的第一个问题是UAA应用程序中没有@AuthorizedFeignClient这个接口。
  • 其次,我从来没有使用@FeignClient成功地从uaa创建到gw-app。

除了与 feign 客户端的通信/配置问题之外,我还担心在没有会话建立(新用户注册)时这将如何工作,然后我有另一个用例,其中我有来自用户的现有会话-管理屏幕(当管理员创建新用户时)

UAA 配置

{
  "generator-jhipster": {
    "promptValues": {
      "packageName": "com.uaa.auth",
      "nativeLanguage": "es"
    },
    "jhipsterVersion": "4.13.3",
    "baseName": "UAA",
    "packageName": "com.agriket.auth",
    "packageFolder": "com/uaa/auth",
    "serverPort": "9999",
    "authenticationType": "uaa",
    "cacheProvider": "hazelcast",
    "enableHibernateCache": true,
    "websocket": false,
    "databaseType": "sql",
    "devDatabaseType": "mysql",
    "prodDatabaseType": "mysql",
    "searchEngine": "elasticsearch",
    "messageBroker": false,
    "serviceDiscoveryType": "eureka",
    "buildTool": "gradle",
    "enableSocialSignIn": false,
    "enableSwaggerCodegen": false,
    "jwtSecretKey": "8e4167f67e9f8d85cc35b70181a828c691374e58",
    "enableTranslation": true,
    "applicationType": "uaa",
    "testFrameworks": [],
    "jhiPrefix": "jhi",
    "nativeLanguage": "es",
    "languages": [
      "es",
      "en"
    ],
    "clientPackageManager": "yarn",
    "skipClient": true
  }
}

网关应用配置

{
  "generator-jhipster": {
    "promptValues": {
      "packageName": "com.app.gw",
      "nativeLanguage": "es"
    },
    "jhipsterVersion": "4.13.3",
    "baseName": "gwApp",
    "packageName": "com.agriket.chat",
    "packageFolder": "com/app/gw",
    "serverPort": "9085",
    "authenticationType": "uaa",
    "uaaBaseName": "UAA",
    "cacheProvider": "hazelcast",
    "enableHibernateCache": true,
    "websocket": "spring-websocket",
    "databaseType": "sql",
    "devDatabaseType": "mysql",
    "prodDatabaseType": "mysql",
    "searchEngine": "elasticsearch",
    "messageBroker": false,
    "serviceDiscoveryType": "eureka",
    "buildTool": "gradle",
    "enableSocialSignIn": false,
    "enableSwaggerCodegen": false,
    "clientFramework": "angularX",
    "useSass": false,
    "clientPackageManager": "yarn",
    "applicationType": "gateway",
    "testFrameworks": [],
    "jhiPrefix": "jhi",
    "enableTranslation": true,
    "nativeLanguage": "es",
    "languages": [
      "es",
      "en"
    ]
  }
}

客户代码

package com.uaa.auth.service.restClient;

import com.uaa.auth.service.restClient.Contact;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.*;

@FeignClient(name = "gwApp")
@RequestMapping("/api")
public interface ContactClient {

    @PostMapping("/contacts")
    Contact createContact(@RequestBody Contact contact);

    @GetMapping("/contacts/{id}")
    Contact getContact(@PathVariable(name = "id") Long id);

}

联系方式

public class Contact {

    private Long id;

    private String login;

    private String firstName;

    private String lastName;


    public Contact(User user) {
        this.id = user.getId();
        this.firstName = user.getFirstName();
        this.lastName = user.getLastName();
    }

    public Long getId() {
        return id;
    }

    public String getLogin() {
        return login;
    }

    public String getFirstName() {
        return firstName;
    }

    public String getLastName() {
        return lastName;
    }
}

【问题讨论】:

    标签: java spring-boot jhipster jhipster-registry


    【解决方案1】:

    要在您的项目中包含 Feign,请使用组 org.springframework.cloud 和工件 ID spring-cloud-starter-openfeign 的启动器。

    我认为 Feign 客户端最适合微服务之间的服务间通信,而不是网关和微服务之间的通信。希望这会对你有所帮助。

    https://cloud.spring.io/spring-cloud-netflix/multi/multi_spring-cloud-feign.html

    【讨论】:

      【解决方案2】:

      我有一个类似的problem 并通过简单地将客户端包从微服务复制到 UAA 服务器并对 application-dev.yml 进行一些小的更改来解决它。见链接

      【讨论】:

        【解决方案3】:

        抱歉,回复晚了。首先是关于您对会议的担忧。会话是处理 cookie 的有状态身份验证中最常用的术语。在我们的 JWT 世界中,您可以认为会话只是访问令牌过期之前的持续时间。

        但是,在您的用例中,您的网关应用应该“作为服务登录”,或者更准确地说:使用客户端凭据流作为内部 OAuth2 客户端进行身份验证。这可以在您的 UAA 中使用此配置插件来完成:

        jhipster:
        ...
        security:
            client-authorization: 
            access-token-uri: uaa/oauth/token 
            token-service-id: uaa 
            client-id: internal 
            client-secret: internal
        

        并使用@AuthorizedFeignCleint。如果您想知道,是的,在这种情况下,UAA 确实会调用自己,这有点奇怪,但它确实有效。 (至少,这是 OAuth 的正确方法)。

        因此,您将有一个针对此明智写入操作的会话。如果没有经过身份验证的用户,您对如何工作感到困惑。通过客户端凭据授予,根本不需要用户,因为您可以保护服务到服务而不是用户到服务的调用。

        【讨论】:

          猜你喜欢
          • 2016-11-25
          • 2018-10-04
          • 2018-12-10
          • 1970-01-01
          • 2018-12-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-09-18
          相关资源
          最近更新 更多