Differences between netflix.feign & openfeign : <h2>Introduction</h2>

<p>I recently used netflix feign along with ribbon which was quite useful. </p>

<p>An Example of this is:</p>

<pre><code>@FeignClient(name = "ldap-proxy")
public interface LdapProxyClient  { 
    @RequestMapping(path = "/ldap-proxy/v1/users/{userNameOrEMail}", produces = MediaType.APPLICATION_JSON_VALUE, method = RequestMethod.GET)
    LdapUser search(@PathVariable("userNameOrEMail") String userNameOrEMail);
}
</code></pre>

<p>However, at some point I thought that instead of having to code all these definitions by hand (for an existing webservice), that I should see if a tool existed.</p>

<p>I stumbled across <code>https://github.com/swagger-api/swagger-codegen</code>and saw that there are examples in which clients are generated, e.g. <a href="https://github.com/swagger-api/swagger-codegen/tree/master/samples/client/petstore/java/feign" rel="noreferrer">https://github.com/swagger-api/swagger-codegen/tree/master/samples/client/petstore/java/feign</a> .</p>

<p>However, once I looked closely at the imports I noticed the following: </p>

<p><code>import feign.Feign;</code></p>

<p>Netflix's opensource solution on the other hand has package names:
<code>org.springframework.cloud.netflix.feign</code>.</p>

<p>Additionally, I noticed that both use ribbon if available, but Netflix's notation is much cleaner with a lot happenning in the background. E.g. the <code>@FeignClient</code> annotation class javadoc states:</p>

<blockquote>
  <ul>
  <li>Annotation for interfaces declaring that a REST client with that interface should be  * created (e.g. for autowiring into another
  component). If ribbon is available it will be  * used to load balance
  the backend requests, and the load balancer can be configured  * using
  a <code>@RibbonClient</code> with the same name (i.e. value) as the
  feign client.</li>
  </ul>
</blockquote>

<p>However in the <code>Feign.feign</code> documentation (at <a href="https://github.com/OpenFeign/feign" rel="noreferrer">https://github.com/OpenFeign/feign</a> ) I see:</p>

<blockquote>
  <p>RibbonClient overrides URL resolution of Feign's client, adding smart routing and resiliency capabilities provided by Ribbon.</p>
  
  <p>Integration requires you to pass your ribbon client name as the host
  part of the url, for example myAppProd.</p>
</blockquote>

<pre><code>&gt; MyService api =
&gt; Feign.builder().client(RibbonClient.create()).target(MyService.class,
&gt; "https://myAppProd");
</code></pre>

<h2>So my questions are:</h2>

<ol>
<li>what is the history/relationship and differences between the two?</li>
<li>what are the pros and cons of each?</li>
</ol>

<p>Are they completely different projects with no relation, or did netflix just fork/utilize OpenFeign and modify it to be within their integrated cloud solution? Essentially, did netflix just acquire and integrate different technologies like Discovery, ribbon, and feign from open-source projects?</p>
